【问题标题】:Elasticsearch - search for substring spanning 2 wordsElasticsearch - 搜索跨越 2 个单词的子字符串
【发布时间】:2019-11-16 07:17:55
【问题描述】:

简单示例

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

1234 Palm Tree Street NE, Miami, FL 33101

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

*alm Tre*

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

基本原理/现实例子

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

R3358b7119 x3387HRL388

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

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

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

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

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

我真的很茫然......

【问题讨论】:

    标签: regex elasticsearch search


    【解决方案1】:

    首先要使正则表达式起作用,您需要为您的name 设置映射not_analyzed,因为Elasticsearch 会将正则表达式应用于该字段的tokenizer 生成的术语,并且不是原文字段

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

    【讨论】:

    • 别提了,很高兴它能以某种方式帮助你:)
    【解决方案2】:

    如果您还不知道,带有.* 的正则表达式的计算成本很高。更弹性搜索方式的解决方案是使用分析器来处理您的问题。

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

    【讨论】:

      猜你喜欢
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多