標籤:

Elasticsearch Logstash Kibana(ELK)代碼和知識點總結(三)

之前已經完成了els的搭建和與mysql資料庫的同步工作,但在前端頁面中搜索的時候,發現搜索的效果並不理想,主要是因為沒有安裝分詞器。

然後打算用

medcl/elasticsearch-analysis-ikgithub.com

網上安裝有的說用maven去編譯之類的,我決定先偷懶直接用./bin/elasticsearch-plugin install github.com/medcl/elasti 去安裝,這裡github上的命令是這樣的,但在windows環境下,發現不太對勁,直接cd到els的bin目錄下,然後elasticsearch-plugin install github.com/medcl/elasti 就行了。然後這是又發現一個問題,發現分詞器與我的els版本並不兼容,而且分詞器發布的版本中也沒有與我的els版本所對應的。我本來想說有沒有命令之類的直接去更新els,但找了一下單機版並沒有什麼靠譜的直接更新方案,更多的是集群更新els。


於是直接下載目前最新版本的els-6.2.1, 然後網上有很多教程寫什麼默認配置,去elasticsearch.yml去改index.analysis.analyzer.ik.type: "ik",或者寫

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: trueindex.analysis.analyzer.default.type: ik

很遺憾,全是錯的。。。那已經是遠古版本了,5.0以上的Elasticsearch早就不支持這些配置,我試了,根本沒用!!!

正確的做法如下:

elasticSearch 分詞器踩的坑blog.csdn.net

怎麼設置IK為所有索引或一個索引的默認分詞器? · Issue #325 · medcl/elasticsearch-analysis-ikgithub.com圖標

es的模板定製我還沒試過,所以我是設置mapping,然後改代碼實現的。貼一下代碼,其實就是根據ik github上的教程改寫的

# -*- coding: utf-8 -*-import elasticsearches_servers = [{ "host": "localhost", "port": "9200" }]es_client = elasticsearch.Elasticsearch(hosts=es_servers)index = "test"doc_type = "text"es_client.indices.create(index=index, ignore=[400, 404])es_client.indices.put_mapping(index=index, doc_type=doc_type, body={ "properties": { "content": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word" } }})insert_list = [美國留給伊拉克的是個爛攤子嗎, 公安部:各地校車將享最高路權, 中韓漁警衝突調查:韓警平均每天扣1艘中國漁船, 中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首]for k, v in enumerate(insert_list): es_client.index(index=index, doc_type=doc_type, id=k, body={content: v})search_res = es_client.search(index=index, body={ "query": {"match": {"content": "中國"}}, "highlight": { "pre_tags": ["<tag1>", "<tag2>"], "post_tags": ["</tag1>", "</tag2>"], "fields": { "content": {} } }})print(search_res)

然後就可以得到正確的切詞結果,可以看到詞語被識別了出來,而不是按照以前的字為單位去識別的。

{ took:4, timed_out:False, _shards:{ total:5, successful:5, skipped:0, failed:0 }, hits:{ total:2, max_score:0.2876821, hits:[ { _index:test, _type:text, _id:2, _score:0.2876821, _source:{ content:中韓漁警衝突調查:韓警平均每天扣1艘中國漁船 }, highlight:{ content:[ 中韓漁警衝突調查:韓警平均每天扣1艘<tag1>中國</tag1>漁船 ] } }, { _index:test, _type:text, _id:3, _score:0.2876821, _source:{ content:中國駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首 }, highlight:{ content:[ <tag1>中國</tag1>駐洛杉磯領事館遭亞裔男子槍擊 嫌犯已自首 ] } } ] }}

模板的事情以後有需求再說2333,主要就是要注意一下ik_max_word 和 ik_smart 的區別。ik_max_word會將文本做最細粒度的拆分,而ik_smart會做最粗粒度的拆分。


推薦閱讀:

ElasticSearch優化系列二:機器設置(內存)
知乎為什麼要自己開發日誌聚合系統「kids」而不用更簡潔方便的「ELK」?
elasticsearch,我用ik分詞,搜索"寶馬2012",怎樣只查出即包含「寶馬」又包含「2012」的文章?

TAG:Elasticsearch |