2016-06-08 85 views
6

我有一個鏈接,如http://drive.google.com,我想將「google」與鏈接相匹配。如何在Elasticsearch中進行部分匹配?

我:

query: { 
    bool : { 
     must: { 
      match: { text: 'google'} 
     } 
    } 
} 

但這只是相匹配,如果整個文本是「谷歌」(不區分大小寫,所以它也符合谷歌或谷歌等)。我如何匹配另一個字符串中的「谷歌」?

+0

也許'match:{text:'。* google。*'}'可以提供幫助。 –

+0

真棒工作!你可以把你的答案作爲「答案」,這樣我可以選擇它作爲最好的答案嗎? – user3835653

+0

我已經添加了答案並提供了一些相關參考。 –

回答

5

的一點是,你正在使用的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."

+0

這對我不起作用。 – Battousai

+0

@Battousai隨時發佈問題。 *您使用正則表達式的方式很可能存在問題。 –

0

對於更通用的解決方案,您可以使用不同的分析器或定義自己的解決方案。我假設您使用的標準分析器將http://drive.google.com分成標記「http」和「drive.google.com」。這就是爲什麼只搜索谷歌是不行的,因爲它試圖將它與完整的「drive.google.com」進行比較。

如果您使用簡單的分析器將文檔編入索引,它會將其分成「http」,「drive」,「google」和「com」。這將允許你自己匹配任何這些條款。