2016-06-08 82 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”。这将允许你自己匹配任何这些条款。