我有一個鏈接,如http://drive.google.com,我想將「google」與鏈接相匹配。如何在Elasticsearch中進行部分匹配?
我:
query: {
bool : {
must: {
match: { text: 'google'}
}
}
}
但這只是相匹配,如果整個文本是「谷歌」(不區分大小寫,所以它也符合谷歌或谷歌等)。我如何匹配另一個字符串中的「谷歌」?
我有一個鏈接,如http://drive.google.com,我想將「google」與鏈接相匹配。如何在Elasticsearch中進行部分匹配?
我:
query: {
bool : {
must: {
match: { text: 'google'}
}
}
}
但這只是相匹配,如果整個文本是「谷歌」(不區分大小寫,所以它也符合谷歌或谷歌等)。我如何匹配另一個字符串中的「谷歌」?
的一點是,你正在使用的requires a full string match正則表達式ElasticSearch:
Lucene的圖案總是固定。提供的模式必須匹配整個字符串。
因此,爲了匹配任何字符(但換行),你可以使用.*
模式:
match: { text: '.*google.*'}
^^ ^^
還有一個變化是針對當你的字符串可以有換行符:match: { text: '(.|\n)*google(.|\n)*'}
。這個可怕的(.|\n)*
是ElasticSearch必須的,因爲此正則表達式不允許任何[\s\S]
解決方法,也不允許任何DOTALL/Singleline標誌。 "The Lucene regular expression engine is not Perl-compatible but supports a smaller range of operators."
這對我不起作用。 – Battousai
@Battousai隨時發佈問題。 *您使用正則表達式的方式很可能存在問題。 –
對於部分匹配,您可以使用prefix或match_phrase_prefix。
對於更通用的解決方案,您可以使用不同的分析器或定義自己的解決方案。我假設您使用的標準分析器將http://drive.google.com分成標記「http」和「drive.google.com」。這就是爲什麼只搜索谷歌是不行的,因爲它試圖將它與完整的「drive.google.com」進行比較。
如果您使用簡單的分析器將文檔編入索引,它會將其分成「http」,「drive」,「google」和「com」。這將允許你自己匹配任何這些條款。
也許'match:{text:'。* google。*'}'可以提供幫助。 –
真棒工作!你可以把你的答案作爲「答案」,這樣我可以選擇它作爲最好的答案嗎? – user3835653
我已經添加了答案並提供了一些相關參考。 –