elasticsearch一個準實時的搜尋引擎,基於lucene構建,它的主要強項還是在全文檢索方面。工作中還是使用到了這部分功能,這裡做一個簡單的總結,可以使初次使用的人很快的配置和使用。
一、全文檢索的概念
首先介紹全文檢索的概念,就是對一篇文章進行索引,可以根據關鍵字搜尋,類似於mysql裡的like語句。
全文索引就是把內容根據詞的意義進行分詞,然後分別建立索引,例如”你們的激情是因為什麼事情來的” 可能會被分詞成:“你們“,”激情“,“什麼事情“,”來“ 等token
這樣當你搜尋“你們” 或者 “激情” 都會把這句搜出來。
二、內建分詞器
elasticsearch實現全文索引,首先要確定分詞器,elasticsearch預設有很多分詞器,你可以參考elasticsearch的官方文件。瞭解分詞器主要是怎麼實現的。
你可以使用
curl -XGET ‘http://192.168.1.101:9200/_analyze?analyzer=standard’ -d ‘你們有什麼事情’
命令來了解各種分詞器的分詞效果。
三、中文分詞器
一般中文分詞器一般使用第三方的ik分詞器、mmsegf分詞器和paoding分詞器,他們最初可能構建於lucene,後來移植於elasticsearch。 在最新版的elasticsearch,我們主要使用了ik分詞器。
安裝ik分詞器到elasticsearch很簡單,它有個外掛目錄analysis-ik,和一個配置目錄ik, 分別拷貝到plugins和conf目錄就可以了。當然你可以使用elasticsearch的plugin命令去安裝,這個過程可能會有些麻煩。
然後在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
意思就是ik分詞器,也可以使用別名ik_analyzer,使用IkAnalyzerProvider類分詞。
ik_max_word、ik_smart也是ik分詞器,只不過一個開啟了use_smart開關,一個沒開啟use_smart。這個本文不關心。
四、curl命令測試分詞器
第三方的分詞器,你是沒法使用
curl -XGET ‘http://192.168.1.101:9200/_analyze?analyzer=standard’ -d ‘你們有什麼事情’ 來檢視分詞效果的。
你必須建立一個指定該分詞器的索引才行。
1、建立索引
curl -XPUT http://192.168.1.101:9200/index
2、建立mapping,這裡就一個欄位content
curl -XPOST http://192.168.1.101:9200/index/fulltext/_mapping -d' { "fulltext": { "_all": { "indexAnalyzer": "ik", "searchAnalyzer": "ik", "store": "false" }, "properties": { "content": { "type": "string", "store": "no", "indexAnalyzer": "ik", "searchAnalyzer": "ik" } } } }'
3、檢視分詞效果
curl -XGET ‘http://192.168.1.101:9200/index/_analyze?analyzer=ik’ -d ‘你們有什麼事情’
4、索引資料
curl -XPOST http://192.168.1.101:9200/index/fulltext/1 -d'{content:”美國留給伊拉克的是個爛攤子嗎”}’
curl -XPOST http://192.168.1.101:9200/index/fulltext/2 -d'{content:”公安部:各地校車將享最高路權”}’
curl -XPOST http://192.168.1.101:9200/index/fulltext/3 -d'{content:”中韓漁警衝突調查:韓警平均每天扣1艘中國漁船”}’
curl -XPOST http://192.168.1.101:9200/index/fulltext/4 -d'{content:”中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首”}’
5、全文檢索
term檢索,如果content分詞後含有中國這個token,就會檢索到
curl -XPOST http://192.168.1.101:9200/index/fulltext/_search -d' {"query" : { "term" : { "content" : "中國" }}}'
querystring檢索,它會先把”中國美國“分詞成中國、美國分別去檢索,然後最後預設是OR的關係
curl -XPOST http://192.168.22.161:9200/index/fulltext/_search -d' { "query" : { "query_string" : { "default_field" : "content", "query" : "中國美國" } } }'
你也可以明顯的寫成
“query” : “中國 AND 美國”
或者
“query” : “中國 OR 美國”
如果你把查詢條件加上雙引號
“query” : “\”中國美國\””
便類似mysql裡的like的效果
五、java客戶端
java程式都有對應的類和方法。建立索引和設定mapping,這裡就不贅述了,這裡有總結:
主要是檢索:
term搜尋主要是用:QueryBuilders.termQuery(“content”, “中國”);
querystring搜尋使用:
QueryStringQueryBuilder queryString = new QueryStringQueryBuilder(“中國 OR 美國”);
queryString.field(“content”);
除非註明,趙巖的部落格文章均為原創,轉載請以連結形式標明本文地址
本文地址:http://zhaoyanblog.com/archives/495.html