我有一个链接,如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
我已经添加了答案并提供了一些相关参考。 –