solr資料庫
SolrQuery solrQuery = new SolrQuery(); Map map = new HashMap(); map.put(FacetParams.FACET_DATE, "manufacturedate_dt"); map.put(FacetParams.FACET_DATE_START,"2004-01-01T00:00:00Z"); map.put(FacetParams.FACET_DATE_END,"2010-01-01...
② solr給資料庫做索引有什麼好處
嚴格來說,lucene負責數據存儲,而solr只是一個引擎提供搜索和插入而已,跟資料庫的解釋器一樣,有什麼好處呢,比如一個資料庫有一個欄位存了1000個字,你想從這些字裡面搜一個詞的時候,普通的資料庫只會讓你使用like去查詢,他會遍歷每個字去模糊匹配,效率很低,而且有些是無法查詢的,當然除了像一些特殊的資料庫帶有分詞,比如postgresql,那lucene做的事情就是分詞,然後去匹配分詞的詞中是否有你想搜的詞就好了,當然了,為了提高這種檢索效率和內存節省底層做了很復雜的事情,可以這么簡單的認為,全文搜索這件事情上資料庫是無法滿足的
③ 關於solr的導入資料庫不能查詢的問題
首先,先查看數據是否導入
再次查詢就可以查到了。
④ solr連接mysql資料庫怎麼用
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory> -->
<!-- <processor class="solr.">
<str name="defaultFieldType">strings</str>
<lst name="typeMapping">
<str name="valueClass">java.lang.Boolean</str>
<str name="fieldType">booleans</str>
</lst>
<lst name="typeMapping">
<str name="valueClass">java.util.Date</st
⑤ solr 怎麼讓從mysql導入的數據是json數組
1. 編寫配置文件
1)編寫 data-config-comment.xml,此文件用於描述如何查詢MySQL數據,如何將數據變換導入索引。
假設有一個資料庫叫mooc,其中有個表叫comment,代表學生的評論
其中:
entity對應MySQL資料庫表中的一行
query對應全庫導入的SQL查詢
queryImportQuery 對應增量導入的SQL查詢
deltaQuery對應增量導入獲取最新修改的行ID,這些ID用於 queryImportQuery,SQL的含義中
DATE(updatetime) >= '${dih.last_index_time}' OR DATE(writetime) >= '${dih.last_index_time}
表示comment的更新時間updatetime,或者comment的寫入時間writetime比上一次的導入時間$(dih.last_index_time)還大。
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/mooc"
user="root"
password="root"/>
<document>
<entity name="comment"
query="SELECT id, DATE_FORMAT(writetime, '%Y-%m-%dT%TZ') as 'writetime', title from comment"
deltaImportQuery="SELECT id, DATE_FORMAT(writetime, '%Y-%m-%dT%TZ') as 'writetime', title from comment where id='${dih.delta.id}'"
deltaQuery="SELECT id FROM comment WHERE DATE(updatetime) >= '${dih.last_index_time}' OR DATE(writetime) >= '${dih.last_index_time}'">
<field column="id" name="id"/>
<field column="writetime" name="writetime"/>
<field column="title" name="title"/>
</entity>
</document>
</dataConfig>
2)假設要創建一個名為mooc的solr核,在其conf目錄中的schema.xml文件中編寫fields,加入id,writetime,title,其中text_cn,需要使用我上一則博客寫的中文分詞插件。
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="writetime" type="tdate" indexed="true" stored="true"/>
<field name="title" type="text_cn" indexed="true" stored="true"/>
3) 配置Solr的 solrconfig.xml
在 D:\libs\solr-4.10.2\example\solr\mooc\conf 目錄中,創建data-config-comment.xml
在solrconfig.xml中創建數據導入handler用來導入comment表,如下編寫,其中的data-config-comment.xml即是第1步寫的
<requestHandler name="/dataimportcomment" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config-comment.xml</str>
</lst>
</requestHandler>
2.配置使用到的JAVA庫文件
創建D:\libs\solr-4.10.2\example\solr\mooc\lib,拷貝solr-dataimporthandler-4.10.2和mysql-connector-java-5.1.26-bin到此,這兩個庫用於導入和查詢資料庫
3.啟動Solr
進入solr的example目錄
java -jar start.jar
3.導入為索引數據
在瀏覽器運行如下命令做全庫導入,表示將數據,導入到Solr核mooc中
http://localhost:8983/solr/mooc/dataimportcomment?command=full-import&commit=y
如果帶clean=false參數,則表示不刪除原數據
增量導入
http://localhost:8983/solr/mooc/dataimportcomment?command=delta-import
4.刪除索引文件
編寫一個XML文件,內容為
<delete><query>*:*</query></delete>
執行命令
⑥ solr 有幾種導入數據的方式
solr數據導入,經過這幾天的查資料,我覺得solr數據導入可以有三種方式:
1、編寫數據xml文件,通過post.jar導入;
2、通過DIH導入;
3、利用solrj導入數據;
現針對第三種方式進行研究,在第一步中寫了一段小的測試代碼,可以參考:http://wiki.apache.org/solr/Solrj#Streaming_documents_for_an_update
具體的代碼解釋如下:
String url = "http://localhost:8080/solr";
HttpSolrServer server = new HttpSolrServer(url);
//If you wish to delete all the data from the index, do this
//server.deleteByQuery( "*:*" );
//Construct a document
SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1_solrj" );
doc1.addField( "type", "doc1_solrj" );
doc1.addField( "name", "name1_solrj" );
//Construct another document
SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2" );
doc2.addField( "type", "doc2_solrj" );
doc2.addField( "name", "name2_solrj" );
//Create a collection of documents
Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
docs.add(doc1);
docs.add(doc2);
//Do a commit
try {
server.add(docs);
server.commit();
} catch (SolrServerException e) {
System.out.println("server commit error, error code:");
e.printStackTrace();
} catch (IOException e) {
System.out.println("server commit error, error code:");
e.printStackTrace();
}
}
該端代碼執行後報異常:expect mime type application/octet-stream but got text/html
沒找到這個的解決辦法,根據提示好像是說期望的類型和伺服器反饋的類型不匹配
最後的解決辦法是這樣的:
之前在配置solr伺服器的時候將solr解壓路徑\solr-4.8.1\example\solr下的solr.xml用\solr-4.8.1\example\multicore下的solr.xml文件進行了替換,目的是為了引入core0和core1,現在需要將這個動作進行回滾,並且修改collection1下的conf下的schema.xml文件,修改為對應的需要的列定義。然後執行以上的代碼就不會產生問題。
原因我也不太明白,感覺應該是collection1的配置和core1、core0、乃至之前文章提到過的solrtest的配置應該不太一樣。原因待查。不過現在已經可以通過客戶端的方式將數據導入solr伺服器,並在前端可以查詢到相應的數據。
⑦ solr中的數據從哪兒來
solr的數據有很多來源方式,資料庫只是其中一種,可以看著這個Solr安裝部署
⑧ solr鏈接資料庫時顯示顯示no information avaliable怎麼辦
說明如下:
query是獲取全部數據的SQL(solr從sql中獲取那些數據),多列
deltaImportQuery是獲取增量數據時使用的SQL(資料庫新增數據追加到solr的數據),多列
deltaQuery是獲取pk的SQL(資料庫新增數據是,追加到solr的數據時的條件,根據id ,條件是最後一次獲取的時間,${dataimporter.last_index_time,最後獲取的時間})!
⑨ 如何用Solr搭建大數據查詢平台
0×00 開頭照例扯淡
自從各種脫褲門事件開始層出不窮,在下就學乖了,各個地方的密碼全都改成不一樣的,重要帳號的密碼定期更換,生怕被人社出祖宗十八代的我,甚至開始用起了假名字,我給自己起一新網名地興才地,這個看起來還不錯的名字,其實是我們家鄉罵人土話,意思是腦殘人士…. -_-|||額好吧,反正是假的,不要在意這些細節。
這只是名,至於姓氏么,每個帳號的注冊資料那裡,照著百家姓上趙錢孫李周吳鄭王的依次往下排,什麼張興才、李興才、王興才……於是也不知道我這樣地興才地了多久,終於有一天,我接到一個陌生電話:您好,請問是馬興才先生嗎?
好么,該來的終於還是來了,於是按名索驥,得知某某網站我用了這個名字,然後通過各種途徑找,果然,那破站被脫褲子了。
果斷Down了那個褲子,然後就一發不可收拾,走上了收藏褲子的不歸路,直到有一天,我發現收藏已經非常豐富了,粗略估計得好幾十億條數據,拍腦袋一想,這不能光收藏啊,我也搭個社工庫用吧……
0×01 介紹
社工庫怎麼搭呢,這種海量數據的東西,並不是簡單的用mysql建個庫,然後做個php查詢select * from sgk where username like 『%xxxxx%』這樣就能完事的,也不是某些幼稚騷年想的隨便找個4g內存,amd雙核的破電腦就可以帶起來的,上面這樣的語句和系統配置,真要用於社工庫查詢,查一條記錄恐怕得半小時。好在這個問題早就被一種叫做全文搜索引擎的東西解決了,更好的消息是,全文搜索引擎大部分都是開源的,不需要花錢。
目前網上已經搭建好的社工庫,大部分是mysql+coreseek+php架構,coreseek基於sphinx,是一款優秀的全文搜索引擎,但缺點是比較輕量級,一旦數據量過數億,就會有些力不從心,並且搭建集群做分布式性能並不理想,如果要考慮以後數據量越來越大的情況,還是得用其他方案,為此我使用了solr。
Solr的基礎是著名的Lucene框架,基於java,通過jdbc介面可以導入各種資料庫和各種格式的數據,非常適合開發企業級的海量數據搜索平台,並且提供完善的solr cloud集群功能,更重要的是,solr的數據查詢完全基於http,可以通過簡單的post參數,返回json,xml,php,python,ruby,csv等多種格式。
以前的solr,本質上是一組servlet,必須放進Tomcat才能運行,從solr5開始,它已經自帶了jetty,配置的好,完全可以獨立使用,並且應付大量並發請求,具體的架構我們後面會講到,現在先來進行solr的安裝配置。
0×02 安裝和配置
以下是我整個搭建和測試過程所用的硬體和軟體平台,本文所有內容均在此平台上完成:
軟體配置: solr5.5,mysql5.7,jdk8,Tomcat8 Windows10/Ubuntu14.04 LTS
硬體配置: i7 4770k,16G DDR3,2T西數黑盤
2.1 mysql資料庫
Mysql資料庫的安裝和配置我這里不再贅述,只提一點,對於社工庫這種查詢任務遠遠多於插入和更新的應用來說,最好還是使用MyISAM引擎。
搭建好資料庫後,新建一個庫,名為newsgk,然後創建一個表命名為b41sgk,結構如下:
id bigint 主鍵 自動增長
username varchar 用戶名
email varchar 郵箱
password varchar 密碼
salt varchar 密碼中的鹽或者第二密碼
ip varchar ip、住址、電話等其他資料
site varchar 資料庫的來源站點
接下來就是把收集的各種褲子全部導入這個表了,這里推薦使用navicat,它可以支持各種格式的導入,具體過程相當的枯燥乏味,需要很多的耐心,這里就不再廢話了,列位看官自己去搞就是了,目前我初步導入的數據量大約是10億條。
2.2 Solr的搭建和配置
首先下載solr:
$ wget
解壓縮:
$ tar zxvf solr-5.5.0.tgz
安裝jdk8:
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default
因為是java跨平台的,Windows下和linux下solr是同一個壓縮包,windows下jdk的安裝這里不再說明。
進入解壓縮後的solr文件夾的bin目錄,solr.cmd和solr分別是windows和linux下的啟動腳本:
因為社工庫是海量大數據,而jvm默認只使用512m的內存,這遠遠不夠,所以我們需要修改,打開solr.in.sh文件,找到這一行:
SOLR_HEAP=地512m地
依據你的數據量,把它修改成更高,我這里改成4G,改完保存. 在windows下略有不同,需要修改solr.in.cmd文件中的這一行:
set SOLR_JAVA_MEM=-Xms512m -Xmx512m
同樣把兩個512m都修改成4G。
Solr的啟動,重啟和停止命令分別是:
$ ./solr start
$ ./solr restart –p 8983
$ ./solr stop –all
在linux下還可以通過install_solr_service.sh腳本把solr安裝為服務,開機後台自動運行。
Solr安裝完成,現在我們需要從mysql導入數據,導入前,我們需要先創建一個core,core是solr的特有概念,每個core是一個查詢、數據,、索引等的集合體,你可以把它想像成一個獨立資料庫,我們創建一個新core:
在solr-5.5.0/server/solr子目錄下面建立一個新文件夾,命名為solr_mysql,這個是core的名稱,在下面創建兩個子目錄conf和data,把solr-5.5.0/solr-5.5.0/example/example-DIH/solr/db/conf下面的所有文件全部拷貝到我們創建的conf目錄中.接下來的配置主要涉及到三個文件, solrconfig.xml, schema.xml和db-data-config.xml。
首先打開db-data-config.xml,修改為以下內容:
<dataConfig>
<dataSource name="sgk" type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/newsgk" user="root" password="password" batchSize="-1" />
<document name="mysgk">
<entity name="b41sgk" pk="id" query="select * from b41sgk">
<field column="id" name="id"/>
<field column="username" name="username"/>
<field column="email" name="email"/>
<field column="password" name="password"/>
<field column="salt" name="salt"/>
<field column="ip" name="ip"/>
<field column="site" name="site"/>
</entity>
</document>
</dataConfig>
這個文件是負責配置導入數據源的,請按照mysql實際的設置修改datasource的內容,下面entity的內容必須嚴格按照mysql中社工庫表的結構填寫,列名要和資料庫中的完全一樣。
然後打開solrconfig.xml,先找到這一段:
<schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>
把它全部注釋掉,加上一行,改成這樣:
<!-- <schemaFactory class="ManagedIndexSchemaFactory">
<bool name="mutable">true</bool>
<str name="managedSchemaResourceName">managed-schema</str>
</schemaFactory>-->
<schemaFactory class="ClassicIndexSchemaFactory"/>
這是因為solr5 以上默認使用managed-schema管理schema,需要更改為可以手動修改。
然後我們還需要關閉suggest,它提供搜索智能提示,在社工庫中我們用不到這樣的功能,重要的是,suggest會嚴重的拖慢solr的啟動速度,在十幾億數據的情況下,開啟suggest可能會導致solr啟動載入core長達幾個小時!
同樣在solrconfig.xml中,找到這一段:
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">mySuggester</str>
<str name="lookupImpl">FuzzyLookupFactory</str> <!-- org.apache.solr.spelling.suggest.fst -->
<str name="dictionaryImpl">DocumentDictionaryFactory</str> <!-- org.apache.solr.spelling.suggest. -->
<str name="field">cat</str>
<str name="weightField">price</str>
<str name="suggestAnalyzerFieldType">string</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.count">10</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
把這些全部刪除,然後保存solrconfig.xml文件。
接下來把managed-schema拷貝一份,重命名為schema.xml (原文件不要刪除),打開並找到以下位置:
只保留_version_和_root_節點,然後把所有的field,dynamicField和Field全部刪除,添加以下的部分:
<field name="id" type="int" indexed="true" stored="true" required="true" multiValued="false" />
<field name="username" type="text_ik" indexed="true" stored="true"/>
<field name="email" type="text_ik" indexed="true" stored="true"/>
<field name="password" type="text_general" indexed="true" stored="true"/>
<field name="salt" type="text_general" indexed="true" stored="true"/>
<field name="ip" type="text_general" indexed="true" stored="true"/>
<field name="site" type="text_general" indexed="true" stored="true"/>
<field name="keyword" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<Field source="username" dest="keyword"/>
<Field source="email" dest="keyword"/>
<uniqueKey>id</uniqueKey>
這里的uniqueKey是配置文件中原有的,用來指定索引欄位,必須保留。新建了一個欄位名為keyword,它的用途是聯合查詢,即當需要同時以多個欄位做關鍵字查詢時,可以用這一個欄位名代替,增加查詢效率,下面的Field即用來指定復制哪些欄位到keyword。注意keyword這樣的欄位,後面的multiValued屬性必須為true。
username和email以及keyword這三個欄位,用來檢索查詢關鍵字,它們的類型我們指定為text_ik,這是一個我們創造的類型,因為solr雖然內置中文分詞,但效果並不好,我們需要添加IKAnalyzer中文分詞引擎來查詢中文。在下載IKAnalyzer for solr5的源碼包,然後使用Maven編譯,得到一個文件IKAnalyzer-5.0.jar,把它放入solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目錄中,然後在solrconfig.xml的fieldType部分加入以下內容:
<fieldType name="text_ik" class="solr.TextField">
<analyzer type="index" useSmart="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
<analyzer type="query" useSmart="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
保存後,core的配置就算完成了,不過要導入mysql數據,我們還需要在mysql網站上下載mysql-connector-java-bin.jar庫文件,連同solr-5.5.0/dist目錄下面的solr-dataimporthandler-5.5.0.jar,solr-dataimporthandler-extras-5.5.0.jar兩個文件,全部拷貝到solr-5.5.0/server/solr-webapp/webapp/WEB-INF/lib目錄中,然後重啟solr,就可以開始數據導入工作了。