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

标签 regex elasticsearch search

简单示例

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

1234 Palm Tree Street NE, Miami, FL 33101

我希望 Elasticsearch 能够找到 Palm Tree在上面的地址中,当我使用 wildcard 时与:

*alm Tre*

相反,我没有得到任何结果。

基本原理/现实示例

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

R3358b7119 x3387HRL388

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

正则表达式似乎不是一个可能的解决方案:(

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

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

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

我真的很迷茫……

最佳答案

首先,要使正则表达式发挥作用,您需要使用 not_analyzed 设置您的name 映射,因为 Elasticsearch 会将正则表达式应用于由该字段的分词器,并且不是该字段的原始文本

"type": {
   "properties": {
      "name": {
         "type": "string",
         "index": "not_analyzed",
         "store": true
      }
   }
}

关于regex - Elasticsearch - 搜索跨越 2 个单词的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56906719/

相关文章:

ruby - 如何选择具有特定扩展名的文件? ruby

java - 文件读取IO

regex - sed:在 [6 位数字] 和空格之后换行

regex - 如何使用 sed 用连字符替换一些空格?

javascript - 将 javascript 字符串中的所有字母和超过 2 个空格替换为空字符

java - Matcher 在 Ubuntu 和 Windows 上给出不同的结果

ruby-on-rails - Elasticsearch::Transport::Transport::Errors::BadRequest [400] 创建索引时

c# - 嵌套排除搜索中的属性

PHP 搜索使用 == 且不区分大小写

elasticsearch - 如果两个文档包含相同的词,如何在弹性中搜索文档?