【问题标题】:In Elasticsearch, how do I search for an arbitrary substring?在 Elasticsearch 中,如何搜索任意子字符串?
【发布时间】:2017-12-01 03:28:10
【问题描述】:

在 Elasticsearch 中,如何搜索任意子字符串,可能包括空格? (搜索一个词的一部分是不够的;我想搜索整个字段的任何子字符串。)

我想它必须在 keyword 字段中,而不是 text 字段中。

假设我的 Elasticsearch 索引中只有几千个文档,我尝试:

  "query": {
         "wildcard" : { "description" : "*plan*" }
  }

效果符合预期——我得到了描述中包含“计划”的每个项目,甚至是“替代”之类的项目。

现在,我想做

  "query": {
         "wildcard" : { "description" : "*plan is*" }
  }   

...这样我就可以在许多其他可能性中匹配带有“Kaplan is not”的文档。

这似乎不适用于通配符、匹配前缀或我可能看到的任何其他查询类型。我如何简单地搜索任何子字符串? (在 SQL 中,我只会做description LIKE '%plan is%'

(我知道任何这样的查询对于大型数据集来说都会很慢甚至不可能。)

【问题讨论】:

标签: elasticsearch lucene


【解决方案1】:

你试过elasticsearch中的regxp query吗?听起来确实是您可能感兴趣的东西。

【讨论】:

  • 希望弹性中可能有更简单的东西,因为这个简单的子字符串搜索似乎是一个非常基本的功能。
【解决方案2】:

我希望这个 Elasticsearch 可能有一些内置的东西,因为这个简单的子字符串搜索似乎是一个非常基本的功能(考虑一下,它在 C 中实现为 strstr(),在 SQL 中实现为 LIKE '%%',大多数文本编辑器中的 Ctrl+F,C# 中的 String.IndexOf 等),但情况似乎并非如此。请注意,正则表达式查询不支持不区分大小写,因此我还需要将其与此自定义分析器配对,以便索引匹配全小写。然后我也可以将我的搜索字符串转换为小写。

{
  "settings": {
    "analysis": {
      "analyzer": {
        "lowercase_keyword": { 
          "type": "custom",
          "tokenizer": "keyword", 
          "filter": [ "lowercase" ] 
        }
      }
    }
  },
  "mappings": { 
     ...
     "description": {"type": "text", "analyzer": "lowercase_keyword"},
  }
}

查询示例:

  "query": {
         "regexp" : { "description" : ".*plan is.*" }
  }

感谢 Jai Sharma 带领我;我只是想提供更多细节。

【讨论】:

  • 这是正确的,但是如果字段长于 32766 则不起作用:原始消息:字节长度最多为 32766;得到 32804","caused_by":{"type":"max_bytes_length_exceeded_exception","re​​ason":"字节长度最多为 32766;有 32804 有什么解决方法吗?
  • 知道了,所以,将任何值保持在 32K 以下。我假设它默认是 UTF-8?
  • 我不能...有很多变通方法,但不是解决方案。
  • 除了通过正则表达式对值低于 32K 的关键字字段进行简单的子字符串搜索外,我仍然看不到其他方法。我同意,这是有限制的。
  • 我在这里提交了一个弹性搜索问题:github.com/elastic/elasticsearch/issues/26759
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 2022-01-23
  • 2015-05-23
  • 2023-04-03
相关资源
最近更新 更多