A. 如何在Elasticsearch中安裝中文分詞器和拼音分詞器
Elasticsearch是一個全文搜索引擎。安裝Elasticsearch時需要先安裝Java。要求的jdk版本1.7以上的。以下是官方文檔:.Specificallyasofthiswriting,
B. 分詞器是什麼
分詞器,是將用戶輸入的一段文本,分析成符合邏輯的一種工具。到目前為止呢,分詞器沒有辦法做到完全的符合人們的要求。和我們有關的分詞器有英文的和中文的英文的分詞器過程:輸入文本-關鍵詞切分-去停用詞-形態還原-轉為小寫中文的分詞器分為:單子分詞 例:中國人 分成中,國,人二分法人詞:例中國人:中國,國人詞典分詞:有基本的語意來進行分詞的,例:中國人分成中國,國人,中國人,現在用的是極易分詞和庖丁分詞。停用詞:不影響語意的詞。網上有很多說分詞器效果的,我在這里就不進行多說了
C. 如何讀取elasticsearch的分詞索引信息
一、插件准備
網上有介紹說可以直接用plugin -install medcl/elasticsearch-analysis-ik的辦法,但是我執行下來的效果只是將插件的源碼下載下來,elasticsearch只是將其作為一個_site插件看待。
所以只有執行maven並將打包後的jar文件拷貝到上級目錄。(否則在定義mapping的analyzer的時候會提示找不到類的錯誤)。
由於IK是基於字典的分詞,所以還要下載IK的字典文件,在medcl的elasticsearch-RTF中有,可以通過這個地址下載:
http://github.com/downloads/medcl/elasticsearch-analysis-ik/ik.zip
下載之後解壓縮到config目錄下。到這里,你可能需要重新啟動下elasticsearch,好讓下一部定義的分詞器能立即生效。
二、分詞定義
分詞插件准備好之後就可以在elasticsearch里定義(聲明)這個分詞類型了(自帶的幾個類型,比如standred則不需要特別定義)。跟其他設置一樣,分詞的定義也可以在系統級(elasticsearch全局范圍),也可以在索引級(只在當前index內部可見)。系統級的定義當然是指在conf目錄下的
elasticsearch.yml文件里定義,內容大致如下:
index:
analysis:
analyzer:
ikAnalyzer:
alias: [ik]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
或者 index.analysis.analyzer.ik.type : "ik"
因為個人喜好,我並沒有這么做, 而是定義在了需要使用中文分詞的index中,這樣定義更靈活,也不會影響其他index。
在定義analyze之前,先關閉index。其實並不需要關閉也可以生效,但是為了數據一致性考慮,還是先執行關閉。(如果是線上的系統需要三思)
curl -XPOST http://localhost:9400/application/_close
(很顯然,這里的application是我的一個index)
然後執行:
curl -XPUT localhost:9400/application/_settings -d '
{
"analysis": {
"analyzer":{
"ikAnalyzer":{
"type":"org.elasticsearch.index.analysis.IkAnalyzerProvider",
"alias":"ik"
}
}
}
}
'
打開index:
curl -XPOST http://localhost:9400/application/_open
到此為止一個新的類型的分詞器就定義好了,接下來就是要如何使用了
或者按如下配置
curl -XPUT localhost:9200/indexname -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik"
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "ik"
}
}
}
}
}'
如果我們想返回最細粒度的分詞結果,需要在elasticsearch.yml中配置如下:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_smart:
type: ik
use_smart: true
ik_max_word:
type: ik
use_smart: false
三、使用分詞器
在將分詞器使用到實際數據之前,可以先測驗下分詞效果:
http://localhost:9400/application/_analyze?analyzer=ik&text=中文分詞
分詞結果是:
{
"tokens" : [ {
"token" : "中文",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
}, {
"token" : "分詞",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
} ]
}
與使用standard分詞器的效果更合理了:
{
"tokens" : [ {
"token" : "中",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 1
}, {
"token" : "文",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 2
}, {
"token" : "分",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 3
}, {
"token" : "詞",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 4
} ]
}
新的分詞器定義完成,工作正常後就可以在mapping的定義中引用了,比如我定義這樣的type:
curl localhost:9400/application/article/_mapping -d '
{
"article": {
"properties": {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
'
很遺憾,對於已經存在的index來說,要將一個string類型的field從standard的分詞器改成別的分詞器通常都是失敗的:
{
"error": "MergeMappingException[Merge failed with failures {[mapper [description] has different index_analyzer, mapper [description] has
different search_analyzer]}]",
"status": 400
}
而且沒有辦法解決沖突,唯一的辦法是新建一個索引,並制定mapping使用新的分詞器(注意要在數據插入之前,否則會使用elasticsearch默認的分詞器)
curl -XPUT localhost:9400/application/article/_mapping -d '
{
"article" : {
"properties" : {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
至此,一個帶中文分詞的elasticsearch就算搭建完成。 想偷懶的可以下載medcl的elasticsearch-RTF直接使用,裡面需要的插件和配置基本都已經設置好。
------------
標准分詞(standard)配置如下:
curl -XPUT localhost:9200/local -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"stem" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "stop", "porter_stem"]
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "stem"
}
}
}
}
}'
index:local
type:article
default analyzer:stem (filter:小寫、停用詞等)
field:title
測試:
# Sample Analysis
curl -XGET localhost:9200/local/_analyze?analyzer=stem -d '{Fight for your life}'
curl -XGET localhost:9200/local/_analyze?analyzer=stem -d '{Bruno fights Tyson tomorrow}'
# Index Data
curl -XPUT localhost:9200/local/article/1 -d'{"title": "Fight for your life"}'
curl -XPUT localhost:9200/local/article/2 -d'{"title": "Fighting for your life"}'
curl -XPUT localhost:9200/local/article/3 -d'{"title": "My dad fought a dog"}'
curl -XPUT localhost:9200/local/article/4 -d'{"title": "Bruno fights Tyson tomorrow"}'
# search on the title field, which is stemmed on index and search
curl -XGET localhost:9200/local/_search?q=title:fight
# searching on _all will not do anystemming, unless also configured on the mapping to be stemmed...
curl -XGET localhost:9200/local/_search?q=fight
例如:
Fight for your life
分詞如下:
{"tokens":[
{"token":"fight","start_offset":1,"end_offset":6,"type":"<ALPHANUM>","position":1},<br>
{"token":"your","start_offset":11,"end_offset":15,"type":"<ALPHANUM>","position":3},<br>
{"token":"life","start_offset":16,"end_offset":20,"type":"<ALPHANUM>","position":4}
]}
-------------------另一篇--------------------
ElasticSearch安裝ik分詞插件
一、IK簡介
IK Analyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源項目Luence為應用主體的,結合詞典分詞和文法分析演算法的中文分片語件。從3.0版本開 始,IK發展為面向Java的公用分片語件,獨立於Lucene項目,同時提供了對Lucene的默認優化實現。在2012版本中,IK實現了簡單的分詞 歧義排除演算法,標志著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。
IK Analyzer 2012特性:
1.採用了特有的「正向迭代最細粒度切分演算法「,支持細粒度和智能分詞兩種切分模式;
2.在系統環境:Core2 i7 3.4G雙核,4G內存,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。
3.2012版本的智能分詞模式支持簡單的分詞排歧義處理和數量詞合並輸出。
4.採用了多子處理器分析模式,支持:英文字母、數字、中文詞彙等分詞處理,兼容韓文、日文字元
5.優化的詞典存儲,更小的內存佔用。支持用戶詞典擴展定義。特別的,在2012版本,詞典支持中文,英文,數字混合詞語。
二、安裝IK分詞插件
假設讀者已經安裝好ES,如果沒有的話,請參考ElasticSearch入門 —— 集群搭建。安裝IK分詞需要的資源可以從這里下載,整個安裝過程需要三個步驟:
1、獲取分詞的依賴包
通過git clone https://github.com/medcl/elasticsearch-analysis-ik,下載分詞器源碼,然後進入下載目錄,執行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar。將這個jar拷貝到ES_HOME/plugins/analysis-ik目錄下面,如果沒有該目錄,則先創建該目錄。
2、ik目錄拷貝
將下載目錄中的ik目錄拷貝到ES_HOME/config目錄下面。
3、分詞器配置
打開ES_HOME/config/elasticsearch.yml文件,在文件最後加入如下內容:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
或
index.analysis.analyzer.default.type: ik
ok!插件安裝已經完成,請重新啟動ES,接下來測試ik分詞效果啦!
三、ik分詞測試
1、創建一個索引,名為index。
curl -XPUT http://localhost:9200/index
2、為索引index創建mapping。
curl -XPOST http://localhost:9200/index/fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"analyzer": "ik"
},
"properties": {
"content": {
"type" : "string",
"boost" : 8.0,
"term_vector" : "with_positions_offsets",
"analyzer" : "ik",
"include_in_all" : true
}
}
}
}'
3、測試
curl 'http://localhost:9200/index/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'
顯示結果如下:
{
"tokens" : [ {
"token" : "text",
"start_offset" : 4,
"end_offset" : 8,
"type" : "ENGLISH",
"position" : 1
}, {
"token" : "世界",
"start_offset" : 11,
"end_offset" : 13,
"type" : "CN_WORD",
"position" : 2
}, {
"token" : "如此",
"start_offset" : 13,
"end_offset" : 15,
"type" : "CN_WORD",
"position" : 3
}, {
"token" : "之大",
"start_offset" : 15,
"end_offset" : 17,
"type" : "CN_WORD",
"position" : 4
} ]
}
D. solr具體怎麼處理分詞
分詞器的工作是將一串的文本切成 tokens,這些 token 一般是文本的子集。分析器的處理對象時一個欄位,分詞器則是面對一串文本,分詞器讀取一串文本,然後將其切割成一堆的 token 對象。
字元串中的空格或連接符會被刪除。字元將被添加或者替換,如映射別名,或者縮寫替換縮寫為正常格式。分詞器可能會產生出與原欄位值不一致的token,或者長度與原始文本不一致。這個在token元數據用於文本欄位高亮搜索結果時需要注意。
<</code>fieldTypename="text"class="solr.TextField">
<</code>analyzer>
<</code>tokenizerclass="solr.StandardTokenizerFactory"/>
</</code>analyzer>
</</code>fieldType>
元素的類名稱不是一個真實的分詞器,但是它指向一個實現了org.apache.solr.analysis.TokenizerFactory介面的類。這個工廠在需要的時候會創建一個分詞器的實例。工廠創建出來的對象必須繼承org.apache.lucene.analysis.TokenStream.
E. 如何使用elasticsearch構建企業級
Elasticsearch實現全文檢索,首先要確定分詞器,ES默認有很多分詞器,可參考官方文檔。了解分詞器主要是怎麼實現的。
一般中文分詞器使用第三方的ik分詞器、mmsegf分詞器和paoding分詞器,最初可能構建於lucene,後來移植於ES。目前我們在最新版的ES中,使用的是IK分詞。
安裝ik分詞器到elasticsearch很簡單,它有個插件目錄analysis-ik,和一個配置目錄ik, 分別拷貝到plugins和conf目錄就可以了。
當你有大量的文本數據時,ES均會將其進行分詞並將這些詞語保存在索引中,當輸入關鍵詞進行查詢時,索引就會起到作用,查找對應的相同的查詢詞,從而實現全文檢索。當然這個過程是很吃內存的。
F. 如何把ES-analysis分詞器打成jar包導入至Eclipse,小白初學,求大神給個詳細打包過程!
Eclipse到處jar包
第一:普通類導出jar包,我說的普通類就是指此類包含main方法,並且沒有用到別的jar包。
1.在eclipse中選擇你要導出的類或者package,右擊,選擇Export子選項;
2.在彈出的對話框中,選擇Java文件---選擇JAR file,單擊next;
3.在JAR file後面的文本框中選擇你要生成的jar包的位置以及名字,注意在Export generated class files and resources和Export Java source files and resources前面打上勾,單擊next;
4.單擊兩次next按鈕,到達JAR Manifest Specification。注意在最底下的Main class後面的文本框中選擇你的jar包的入口類。單擊Finish,完成。
你可以在dos環境下,進入你的jar所在的目錄,運行 java -jar 名字.jar,檢測運行是否正確。
運行cmd->進入jar目錄->java–jar文件名.jar
第二、你所要導出的類里邊用到了別的jar包。比如說你寫的類連接了資料庫,用到資料庫驅動包oracl.jar.。
1.先把你要導出的類按照上面的步驟導出形成jar包,比如叫test.jar
2.新建一個文件夾main,比如在D盤根目錄下;
3.把test.jar和oracl.jar拷貝到main文件下,右擊test.jar,解壓到當前文件夾。把META-INF\MANIFEST.MF剪切到另外一個地方(比如是桌面!);
4.右擊oracl.jar,解壓到當前文件夾。
5.在dos環境下,進入到D盤的main文件夾下,執行 jar cvfm new.jar meta-inf/manifest.mf .,不要忘了最後面的點。
6.用壓縮工具打開你新生成的new.jar,用你放在桌面的META-INF\MANIFEST.MF覆蓋new.jar原有。
你可以在dos環境下,進入你的jar所在的目錄,運行 java -jar 名字.jar,檢測運行是否正確。
G. solr ext.dic哪裡有
1、將解壓包中的solr-4.7.1/dist/solr-4.7.1.war復制到tomcat_dir/webapps/目錄,並命名為solr.war。
2、將solr-4.7.1/example/lib/ext/目錄下的jar文件復制到tomcat/lib目錄下,將solr-4.7.1/example/resources/下的log4j.properties文件復制到tomcat_dir/lib目錄下;
切把 solr-4.7.1/example/solr,復制到tomcat_dir/bin下。
3、修改tomcat_dir/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
4、創建solr.xml,存放在路徑:tomcat/conf/Catalina/localhost/solr.xml,內容:
<Context path="/solr" docBase="C:\Tomcat 7.0\webapps\solr.war"
debug="0" crossContext="true">
<Environment name="solr/home" type="java.lang.String" value="C:\Tomcat 7.0\bin\solr\" override="true" />
</Context>
PS:上面的docBase和value路徑中不能存在中文字元,否則會出現404錯誤。
5、將C:\Tomcat 7.0\webapps下的solr.war包,啟動項目解壓;然後再添加幾個jar包:
solr-4.7.1\dist\solr-dataimporthandler-4.7.1.jar;
solr-4.7.1\dist\solr-dataimporthandler-extras-4.7.1.jar;
還要載入資料庫驅動包:mysql-connector-java-3.1.13-bin.jar
6、在C:\Tomcat 7.0\bin\solr\collection1\conf 下的solrconfig.xml增加以下資料庫配置:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
7、將tomcat\bin\solr\collection1\conf下增加data-config.xml文件,內容如下:
<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://192.168.1.221:3306/tmsdb"
user="root"
password="123456"/>
<document name="content">
<entity name="node" query="select id,author,title,content from solrdb">
<field column="id" name="id" />
<field column="author" name="author" />
<field column="title" name="title" />
<field column="content" name="content" />
</entity>
</document>
</dataConfig>
8、增加中文分詞器,ik-analyzer的配置如下:
①目前的中文分詞主要有兩種
1,基於中科院ICTCLAS的隱式馬爾科夫hhmm演算法的中文分詞器,例如smartcn等。(不支持自定義擴展詞庫)
2,基於正向迭代最細粒度切分演算法(正向最大匹配並且最細分詞)例如IK,庖丁等(支持自定義擴展詞庫)
安裝分詞前,可以去下載IK的分詞包 :
IK-Analyzer-4.7.1-0.0.1-SNAPSHOT.jar
下載完畢後,將此包放進tomcat\solr的\WEB-INF\lib下面:tomcat\webapps\solr\WEB-INF\lib 。
下面需要在solr的schemal.xml進行分詞器注冊:
<!-- 配置IK分詞器 -->
<fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<!-- 分詞-->
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
<!-- 禁用詞過濾根據情況使用-->
<!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/> -->
</analyzer>
<analyzer type="query">
<!-- 分詞-->
<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"/>
<!-- 禁用詞過濾根據情況使用-->
<!-- <filter class="org.wltea.analyzer.lucene.IKStopFilterFactory"/>-->
</analyzer>
</fieldType>
最後還得配置一個引用欄位就OK了
<field name="ik" type="text_ik" indexed="true" stored="true" multiValued="true"/>
②它的安裝部署十分簡單,將IKAnalyzer2012.jar部署亍項目的lib目錄中;IKAnalyzer.cfg.xml不stopword.dic文件放置在class根目錄(對於web項目,通常是WEB-I NF/classes目彔,同hibernate、log4j等配置文件相同)下即可 ;然後配置solr4.7中schema.xml配置解析器:
<schema name="example" version="1.1">
……
<fieldType name="text" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
……
</schema>
H. elasticsearch為什麼從2.x直接更新到5.x
為了ELK(ElasticSearch, logstash, kibana)技術棧的版本統一,免的給用戶帶來混亂。
I. 如何根據多語言自動選用不同的分詞器
經測試ICUAnalyzer能處理多種語言的混合體,能識別語言,但分詞效果不好,都是英文單詞,中日韓單字,對俄文的支持就更弱了,會分解成單個字元;
SmartCNAnalyzer能處理中英文混合體,分詞效果也不錯,但缺點是對其他的語言支持不好;
要同時處理多語言混合體分詞,這確實是個NLP難題,我的一種想法是實現一個Analyzer的Facade,實現二次分詞: 首先是進行一次WhiteSpaceAnalyzer分詞,然後再對分詞結果來調用不同語言的分詞器來分詞.
J. java web 怎麼用solr
我們下載的Solr包後,進入Solr所在的目錄,我們可以看到以下幾個目錄:build、client、dist、example、lib、site、src。下面分別對其進行介紹。
1) build:該目錄是在ant build過程中生成的,其中包含了未被打包成jar或是war的class文件以及一些文檔文件。
2) client:該目錄包含了特定語言的Solr客戶端API,使得使用其他語言的用戶能通過HTTP用XML與Solr進行通話。現在該目錄裡面雖然包含javascript、python、ruby三個子目錄,但是到目前為止只包含一部分的ruby的代碼,其他語言仍是空的。另外,Solr的Java客戶端稱為SolrJ,其代碼位於src/solrj目錄下面。在之後的文章中我會詳細介紹Solr客戶端的使用。
3) dist:該目錄包含build過程中產生的war和jar文件,以及相關的依賴文件。還記得上一篇文章中,我們在build 1.4版本的Solr源代碼後需要部署example嗎?其實就是將該目錄下面的apache-solr-1.4.war部署到Jetty上面去,並重命名為solr.war。
4) example:這個目錄實際上是Jetty的安裝目錄。其中包含了一些樣例數據和一些Solr的配置。
其中一些子目錄也比較重要,這里也對它們稍作介紹。
l example/etc:該目錄包含了Jetty的配置,在這里我們可以將Jetty的默認埠從8983改為80埠。
l 將其中的8983埠換成80埠。注意更改埠後啟動Jetty可能會提示你沒有許可權,你需要使用sudo java -jar start.jar來運行。
l example/multicore:該目錄包含了在Solr的multicore中設置的多個home目錄。在之後的文章中我會對其進行介紹。
l example/solr:該目錄是一個包含了默認配置信息的Solr的home目錄。
詳見下面的「solr home說明」
l example/webapps:Jetty的webapps目錄,該目錄通常用來放置Java的Web應用程序。在Solr中,前面提到的solr.war文件就部署在這里。
5) lib:該目錄包含了所有Solr的API所依賴的庫文件。其中包括Lucene,Apache commons utilities和用來處理XML的Stax庫。
6) site:該目錄僅僅包含了Solr的官網的網頁內容,以及一些教程的PDF文檔。
7) src:該目錄包含了Solr項目的整個源代碼。這里對其各個子目錄也做相應的介紹。
l src/java:該目錄存放的是Solr使用Java編寫的源代碼。
l src/scripts:該目錄存放的是配置Solr伺服器的Unix BashShell腳本,在後面介紹多伺服器配置中將會有重要的作用。
l src/solrj:前面提到過該目錄存放的是Solr的Java版本的客戶端代碼。
l src/test:該目錄存放的是測試程序的源代碼和測試文件。
l src/webapp:該目錄存放的是管理Solr的Web頁面,包括Servlet和JSP文件,其構成了前面提到的WAR文件。管理Solr的JSP頁面在web/admin目錄下面,如果你有興趣折騰Solr可以找到相應的JSP的頁面對其進行設置
1.4.2 Solr home說明
所謂的Solr home目錄實際上是一個運行的Solr實例所對應的配置和數據(Lucene索引)。在上一篇文章中我提到過在Solr的example/solr目錄就是一個Solr用做示例的默認配置home目錄。實際上example/multicore也是一個合法的Solr home目錄,只不過是用來做mult-core設置的。那麼我們來看看example/solr這個目錄裡面都有些什麼。
example/solr目錄下主要有以下一些目錄和文件:
1) bin:如果你需要對Solr進行更高級的配置,該目錄建議用來存放Solr的復制腳本。
2) conf :該目錄下麵包含了各種配置文件,下面列出了兩個最為重要的配置文件。其餘的.txt和.xml文件被這兩個文件所引用,如用來對文本進行特殊的處理。
l conf/schema.xml:該文件是索引的schema,包含了域類型的定義以及相關聯的analyzer鏈。
l conf/solrconfig.xml:該文件是Solr的主配置文件。
l conf/xslt:該目錄包含了各種XSLT文件,能將Solr的查詢響應轉換成不同的格式,如:Atom/RSS等。
3) data:包含了Lucene的二進制索引文件。
4) lib:該目錄是可選的。用來放置附加的Java JAR文件,Solr在啟動時會自動載入該目錄下的JAR文件。這就使得用戶可以對Solr的發布版本(solr.war)進行擴展。如果你的擴展並不對Solr本身進行修改,那麼就可以將你的修改部署到JAR文件中放到這里。
Solr是如何找到運行所需要的home目錄的呢?
Solr首先檢查名為solr.solr.home的Java系統屬性,有幾種不同的方式來設置該Java系統屬性。一種不管你使用什麼樣的Java應用伺服器或Servlet引擎都通用的方法是在調用Java的命令行中進行設置。所以,你可以在啟動Jetty的時候顯式地指定Solr的home目錄java -Dsolr.solr.home=solr/ -jar start.jar。另一種通用的方法是使用JNDI,將home目錄綁定到java:comp/env/solr/home。並向src/webapp/web/WEB-INF/web.xml添加以下一段代碼:
1 <env-entry>
2 <env-entry-name>solr/home</env-entry-name>
3 <env-entry-value>solr/</env-entry-value>
4 <env-entry-type>java.lang.String</env-entry-type>
5 </env-entry>
實際上這段XML在web.xml文件中已經存在,你只需要把原來注釋掉的xml取消注釋,添加你所要指向的home目錄即可。因為修改了web.xml文件,所以你需要運行antdist-war來重新打包之後再部署WAR文件。
最後,如果Solr的home目錄既沒有通過Java系統屬性指定也沒有通過JNDI指定,那麼他將默認指向solr/。
在產品環境中,我們必須設置Solr的home目錄而不是讓其默認指向solr/。而且應該使用絕對路徑,而不是相對路徑,因為你有可能從不同的目錄下面啟動應用伺服器。
註:Jetty 是一個開源的servlet容器,它為基於Java的web內容,例如JSP和servlet提供運行環境。Jetty是使用Java語言編寫的,它的API以一組JAR包的形式發布。開發人員可以將Jetty容器實例化成一個對象,可以迅速為一些獨立運行(stand-alone)的Java應用提供網路和web連接。
我們先從使用者的角度出發,最先看到的當然是servlet,因為Solr本身是個獨立的網路應用程序,需要在Servlet容器中運行來提供服務,所以servlet是用戶接觸的最外層。我們看看org.apache.solr.servlet包。這個包很簡單,只有兩個類:SolrServlet和SolrUpdateServlet.我們很容易從類名中猜出這兩個類的用途。
SolrServlet類繼承HttpServlet類,只有四個方法:
· init()
· destroy()
· doGet()
· doPost()
SolrServlet類中除了普通的Java類對象(包括Servlet相關的)外,有四個Solr本身的類,還有一個Solr本身的異常。其中兩個類和一個異常屬於org.apache.solr.core包,兩個類屬於org.apache.solr.request包。屬於core包的有:
· Config:
· SolrCore:
屬於request包的有:
· SolrQueryResponse:
· QueryResponseWriter:
分析一下這個SolrServlet類。首先servlet會調用init()方法進行初始化:通過Context查找java:comp/env/solr/home來確定Solr的主目錄(home),接著調用Config.setInstanceDir(home)方法設置這個實例的目錄。然後通過SolrCore.getSolrCore()來獲得一個SolrCore實例。destroy()方法將會在Servlet對象銷毀時調用,僅僅調用core.close()關閉SolrCore實例。
當用戶請求進來時doPost()簡單地將任務交給doGet()完成,主要的任務由doGet()完成。分析一下doGet()方法:
1) 使用SolrCore和doGet()參數request生成一個SolrServletRequest對象(注意:這個SolrServletRequest類不是公開類,位於org.apache.solr.servlet包中,繼承了SolrQueryRequestBase類,僅僅接受SolrCore和HttpServletRequest對象作為參數)
2) 然後SolrCore執行execute()方法(參數為SolrServletRequest和SolrQueryResponse)
由此可見,真正的處理核心是SolrCore的execute方法