elasticsearch,我用ik分詞,搜索"寶馬2012",怎樣只查出即包含「寶馬」又包含「2012」的文章?
01-21
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 |