Elasticsearch-搜索跨越2个单词的子字符串

时间:2019-07-05 16:45:20

标签: regex elasticsearch search

简单示例

我有一个带有name文本字段的文档,该文本字段通常包含地址:

1234 Palm Tree Street NE, Miami, FL 33101

当我将Palm Tree与以下命令配合使用时,我希望Elasticsearch在上述地址中找到wildcard

*alm Tre*

相反,我没有结果。

理论/实际示例

有时name字段包含跨越2个单词的编码信息,如下所示:

R3358b7119 x3387HRL388

我正在使用带有*<search phrase>*的通配符,当用户输入2个完整的“单词”或单个不完整的单词时,该通配符有效。但是,如果用户输入一个单词的结尾和下一个单词的开头,例如b7119 x3387(使用上面的示例),则不会返回文档。

Regexp似乎不是一个可能的解决方案:(

我尝试使用正则表达式搜索:

{'regexp': {'name': '.*b7119 x3387.*'}}

但是即使那样也没有返回文档。

我真的很茫然...

2 个答案:

答案 0 :(得分:2)

首先要使正则表达式工作,您需要使用&arr[0][0]name设置映射,因为Elasticsearch会将正则表达式应用于令牌生成器生成的条款该字段,并且不是该字段的原始文本

not_analyzed

答案 1 :(得分:1)

如果您还不知道,带.*的regexp的计算量很大。一种更具弹性搜索方式的解决方案是使用分析器来解决您的问题。

您可以创建一个没有空格的字段,并使用ngram analyzer将文本拆分为子标记。该解决方案应该更快一些,但是将需要更多的磁盘空间来存储所有子集。