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

时间:2019-06-10 19:31:49

标签: elasticsearch search search-engine

我一直在使用通配符,例如:*blah*但是文档指出您不应该以{{1​​}}开头通配符值,因为它会增加所需的迭代次数并降低搜索性能。

此外,文档中没有指示通配符是否旨在区分大小写。我注意到,当我搜索小写字母“ a”时,我得到了所有同时具有“ a”或“ A”的东西,但是当我搜索大写字母“ A”时,实际上是*,我没有得到结果。

我希望此特定搜索的行为与例如,如果我使用*A*时,Django的ORM行为完全一样,包括不区分大小写。因此,如果我说filter(title__icontains=‘blah’),我希望返回标题中带有“ the”(不区分大小写)的任何内容。

1 个答案:

答案 0 :(得分:1)

我不知道您将如何避免使用通配符查询的警告方法,因此,如果您在语法上遇到麻烦,这就是下面的样子:

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

我刚刚在自己的搜索索引上测试了这种类型的查询,然后搜索与产品标题中的“起泡”正确匹配的*oam*


对于不区分大小写,只要您使用内置分析器之一(例如{{3} }或Standard)。但是,如果您使用的是自定义分析器,则只需确保包含lowercase过滤器,以及您想通过其运行条款的其他任何过滤器。

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

如果您未在字段映射中指定分析器,那么我认为默认情况下它使用standard,其中包括小写过滤。