Elasticsearch查询过滤器组合问题

问题描述

我试图理解为什么下面的Elasticsearch查询不起作用。

编辑:

查询中提到的字段来自不同的索引。例如,过滤器的分类字段与查询字符串中提到的字段的索引不同。

过滤器查询的期望是,当用户专门在分类字段(即秘密或受保护的)上进行搜索时,将显示这些值。否则,如果用户从其他索引中搜索任何其他字段,例如名字或人,则不应考虑应用了任何过滤器,因为名字或人不属于该过滤器

{
    "query": {
        "bool": {
                    "filter": {
                        "terms": {
                            "classification": [
                                "secret","protected"
                            ]
                        }
            },"must": {
                "query_string": {
                    "query": "*john*","fields": [
                        "classification","firstname","releasability","person"
                    ]
                }
            }
        }
    }
}

返回的预期结果是现场人员中的john。当上面的代码中未应用任何过滤器时,此方法有效

{
    "query": {
     
                    

                "query_string": {
                   "query": "*john*","person"
                    ]
                }
            
        
    }
}

过滤器的目的仅是当所述字段包含提到的值时过滤记录,否则它应适用于所有值。

为什么不生成john的结果,而仅生成分类值的结果?

解决方法

添加带有示例索引数据和搜索查询的工作示例。

要了解有关布尔查询的更多信息,请参阅此官方documentation

索引数据: my_index索引中的索引数据

{
    "name":"John","title":"b"
}
{
    "name":"Johns","title":"a"
}

my_index1索引中的索引数据

{
    "classification":"protected"
}
{
    "classification":"secret"
}

搜索查询:

POST http://localhost:9200/_search

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": [
              {
                "terms": {
                  "classification": [
                    "secret","protected"
                  ]
                }
              }
            ]
          }
        },{
          "bool": {
            "must": [
              {
                "query_string": {
                  "query": "*john*","fields": [
                    "name","title"
                  ]
                }
              }
            ]
          }
        }
      ]
    }
  }
}

搜索结果:

 "hits": [
      {
        "_index": "my_index","_type": "_doc","_id": "1","_score": 1.0,"_source": {
          "name": "John","title": "b"
        }
      },{
        "_index": "my_index","_id": "2","_source": {
          "name": "Johns","title": "a"
        }
      },{
        "_index": "my_index1","_score": 0.0,"_source": {
          "classification": "secret"
        }
      },"_source": {
          "classification": "protected"
        }
      }
    ]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...