如何在 Elasticsearch 中找到所有包含“blah”的 objects?

How does one find all objects that contain “blah” in Elasticsearch?

我一直在像这样使用 wildcard*blah* 但是,文档声明您不应该使用 * 作为通配符值的开头,因为它会增加所需的迭代次数并降低搜索性能。

此外,文档中也没有说明通配符是否打算 case-insensitive。我注意到,当我搜索小写字母“a”时,我得到的是同时包含“a”或“A”的所有内容,但是当我搜索大写字母“A”时,字面意思是 *A*,我没有返回完全没有结果。

我希望此特定搜索的行为与我使用 filter(title__icontains=‘blah’) 时 Django 的 ORM 的行为完全相同,包括 case-insensitivity。因此,如果我说 get me all records that contain the word ‘the’ in the title,我希望返回标题中带有“the”(case-insensitive) 的任何内容。

我不知道您将如何绕过使用通配符查询的谨慎方法,所以如果您只是在语法方面遇到问题,那么它看起来应该是这样的:

GET /_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "*elved*",
        "boost": 1.0,
        "rewrite": "constant_score"
      }
    }
  }
}

我刚刚在自己的搜索索引上测试了此类查询,并在产品标题中搜索 *oam* 正确匹配 "foaming"。


至于 case-insensitivity,只要您使用 built-in 之一,就应该处理 out-of-the-box分析器(例如 Standard or English)。但是,如果您使用的是自定义分析器,那么您只需要确保包括 lowercase 过滤器,以及您想要 运行 条款通过的任何其他过滤器。

PUT index_name
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  }
}

如果您没有在字段映射中指定分析器,那么我相信它默认使用 standard,其中包括小写过滤。