【问题标题】:Elasticsearch multi term filterElasticsearch 多词过滤器
【发布时间】:2014-01-18 10:19:14
【问题描述】:

我对 Elasticsearch 很陌生,所以这是我的问题。 我想用 elasticsearch 做一个搜索查询,并想用多个词过滤。

如果我想搜索用户“tom”,那么我想要用户“isActive = 1”、“isPrivate = 0”和“isOwner = 1”的所有匹配项。

这是我的搜索查询

"query":{
    "filtered": {
        "query": {
            "query_string": {
                "query":"*tom*",
                "default_operator": "OR",
                "fields": ["username"]
            }
        },
        "filter": {
            "term": { 
                "isActive": "1",
                "isPrivate": "0",
                "isOwner": "1"
            }
        }
    }
}   

当我使用 2 个术语时,它就像一个魅力,但当我使用 3 个术语时,它不会。

感谢您的帮助!

【问题讨论】:

  • 真正的答案可以在stackoverflow.com/a/46383259/308851 找到——它是过滤器下的术语对象列表,从@ 中可以看出根本没有 987654322@ 因为 filter 的值是一个 single 术语对象。

标签: elasticsearch


【解决方案1】:

你应该使用bool filterAND你所有的条款:

"query":{
    "filtered": {
        "query": {
            "query_string": {
                "query":"*tom*",
                "default_operator": "OR",
                "fields": ["username"]
            }
        },
        "filter": {
            "bool" : {
                "must" : [
                    {"term" : { "isActive" : "1" } },
                    {"term" : { "isPrivate" : "0" } },
                    {"term" : { "isOwner" : "1" } }
                ]
             }
         }
     }
}   

对于 2.x+ 版本,您可以使用 bool 查询而不是 filtered 查询并进行一些简单的替换:https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-filtered-query.html

【讨论】:

  • 我想知道为什么弹性版本之间会出现这种不一致。
  • 以防万一我对单个字段的多个值进行过滤查询,它是如何进行的,例如,如果有三种类型 id:1、2、3 并且我需要使用 id 进行过滤(包含2 或 3)
  • 你可以使用terms查询,参考elastic.co/guide/en/elasticsearch/reference/current/…
【解决方案2】:

正如其中一位 cmets 所说,语法在最近的 ES 版本中发生了变化。如果您使用的是 Elasticsearch 6.+,并且您想在查询中使用通配符和一系列术语(例如在问题中),您可以使用如下内容:

GET your_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "your_field_name_1": {
              "value": "tom*"
            }
          }
        },
        {
          "term": {
            "your_field_name_2": {
              "value": "US"
            }
          }
        },
        {
          "term": {
            "your_field_name_3": {
              "value": "Michigan"
            }
          }
        },
        {
          "term": {
            "your_field_name_4": {
              "value": "0"
            }
          }
        }
      ]
    }
  }
}

另外,来自documentation 关于通配符查询:

请注意,此查询可能会很慢,因为它需要遍历许多 条款。为了防止非常慢的通配符查询,通配符 术语不应以通配符 * 或 ? 之一开头。

我希望这会有所帮助。

【讨论】:

  • 如果您确实需要使用前面的通配符进行搜索,您可以使用一个技巧并使用翻转值(tom -> mot)索引一个附加字段并对其执行或搜索: originalfield:tom* 或新田:莫特*。这应该更快。
  • 根据elastic.co/guide/en/elasticsearch/reference/current/…must 不能替代filter:“不像must,查询的分数将被忽略”
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2015-09-08
相关资源
最近更新 更多