elasticsearch的實現全文檢索

lionzl發表於2016-11-02

elasticsearch的實現全文檢索

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”);

相關文章