【问题标题】:using array matches in filter query elasticsearch在过滤器查询弹性搜索中使用数组匹配
【发布时间】:2021-11-04 14:31:00
【问题描述】:

我在弹性搜索中有这种类型的数据

    {
      "name":"John Doe",
       "age":"31",
       "state":"PA"
    
    
    },
    {
      "name":"John Doe",
       "age":"30",
       "state":"VA"
    
    
    },
    {
      "name":"John Doe",
       "age":"30",
       "state":"AZ"
    
    }
    
   

我想找到亚利桑那州和加利福尼亚州的所有 John Doe。

我有以下查询

    {
        "query": {
            "bool": {
                "must": [
                   {
                        "term": {
                             "name": "John Doe"
                        }
                    },
                    {
                        "terms": {
                            "state":["AZ,"CA"]
                        }
                    }
                    
                ]
            }
        }
    }
    
    

这显示我在返回的结果中评分,无论如何也可以通过使用过滤器和术语条件来禁用评分

```
{
        "query": {
            "bool": {
                "filter": [
                   {
                        "term": {
                             "name": "John Doe"
                        }
                    }
                    
                ]
            }
        }
    }```

如何使用上面的过滤器和数组查询elasticsearch中的文档

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    1. 查询参数表示查询上下文。
    2. 在查询上下文中使用了 bool 和两个 match 子句,这 表示它们用于对每个文档的匹配程度进行评分。
    3. filter 参数表示过滤上下文。它的期限和范围 子句用于过滤上下文。他们会过滤掉文件 不匹配,但不会影响匹配分数 文件。

    【讨论】:

    • 为查询上下文中的查询计算的分数表示为单精度浮点数;它们只有 24 位来表示有效数字的精度。超过有效数字精度的分数计算将被转换为具有精度损失的浮点数。
    • 在查询上下文中使用查询子句来处理应该影响匹配文档得分的条件(即文档匹配程度),并在过滤上下文中使用所有其他查询子句。
    【解决方案2】:

    filter and must 子句都用作逻辑 AND 运算符。唯一的区别是,在filter 子句中,评分被忽略,而在must 子句中,匹配的文档有助于评分。

    您可以将 bool must 查询包装在 filter 子句中,如下所示

    {
      "query": {
        "bool": {
          "filter": {
            "bool": {
              "must": [
                {
                  "term": {
                    "name.keyword": "John Doe"
                  }
                },
                {
                  "terms": {
                    "state.keyword": [
                      "AZ",
                      "CA"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    或者您可以将must 子句替换为filter 子句

    {
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "name.keyword": "John Doe"
              }
            },
            {
              "terms": {
                "state.keyword": [
                  "AZ",
                  "CA"
                ]
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • @Bunty 你有没有机会浏览答案,期待得到你的反馈;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2015-10-31
    • 1970-01-01
    • 2020-07-25
    • 2021-01-18
    相关资源
    最近更新 更多