一尘不染

在Elasticsearch中,如何搜索任意子字符串?

elasticsearch

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

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

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

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

可以按预期工作,我得到了描述中“计划”所在的每个项目,甚至是“替代”项目。

现在,我想做

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

…以便在许多其他可能性中将文件与“ Kaplan不是”相匹配。

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

(我知道对于大型数据集,任何此类查询都将很慢,甚至可能无法进行。)


阅读 816

收藏
2020-06-22

共1个答案

一尘不染

我希望有可能是一个内置的这个Elasticsearch,因为这个简单的字符串搜索似乎是一个非常基本的能力(关于它的思考,它是作为strstr()在C,LIKE '%%'在SQL中,按Ctrl +
F在大多数文本编辑器,String.IndexOf在C#等),但事实并非如此。请注意,regexp查询不支持不区分大小写,因此我还需要将其与该自定义分析器配对,以便索引匹配全小写字母。然后,我也可以将搜索字符串转换为小写。

{
  "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带领我;我只是想提供更多细节。

2020-06-22