標籤:

elasticsearch,我用ik分詞,搜索"寶馬2012",怎樣只查出即包含「寶馬」又包含「2012」的文章?

elasticsearch,我用ik分詞,搜索"寶馬2012",怎樣只查出即包含「寶馬」又包含「2012」的文章。默認他是會把包含「寶馬」或包含「2012」的文章都查詢出來。


1.首先要保證你的IK分詞器能切分「寶馬2012」為「寶馬」,「2012」

2.matchQuery中用and語法即可

QueryBuilders.matchQuery(key, "
寶馬2012
").operator(Operator.AND)


因為搜索的語句會默認的經過分詞,會使得搜索寶馬2012的結果等於是搜索寶馬+2012,再加上ES支持不完全匹配的特性,從而默認會把其他有不完全相關的結果都找出來。 按照你的要求,可以設置搜索語句不經過分析,這樣使得寶馬2012作為一個整體。需要用到query中的analyzer屬性並且使用正則表達式分詞實現完全匹配。(Query String Query)

這種方式與其他比較靈活性比較大,不用每一次搜索類似的不同內容都更改詞典。

附:完全匹配的分析器配置方法

{

"analysis": {

"analyzer": {

"whole_tokenizer": {

"type": "custom",

"tokenizer": "whole_tokenizer"

}

},

"tokenizer": {

"whole_tokenizer": {

"type": "pattern",

"group": 0,

"pattern": "(.*)"

}

}

}

}


把寶馬和2012加入到mydict.dic內,然後重新建立分詞索引就可以了


解決問題方法有多種,@大周說了其中的一種,我擴展了一下,幫助樓主了解為什麼。

elasticsearch支持不同類型搜索的query,例如match query,term query, bool query,phrase query,不知道樓主用的是哪一種。我猜應該用的是match query,ik將"寶馬2012"分成了"寶馬"和"2012",所以只要匹配到了"寶馬"或者"2012"的文檔都會被返回,只是同時包含二者的文檔的相關性要高一些。如果樓主要同時包含二者,可以指定match query的operator為and,也可以用bool query或者phrase query。這些其實在es的官方文檔裡面都有提到:Match Query。


要還房貸


使用phrase_match即可


要改es ik的源代碼。默認是把英文詞、中文詞、數字、標點切分成不同的token的。你改成英文後面跟數字不切分token就可以了。


你需要自定義你的dict


推薦閱讀:

學習elasticsearch必須先學習lucene嗎?
Elasticsearch到底能玩多大的數據量?
知乎為什麼要自己開發日誌聚合系統「kids」而不用更簡潔方便的「ELK」?
如何用zabbix監控elasticsearch?

TAG:Elasticsearch |