lucene - 添加术语过滤器时的 Elasticsearch 查询解析异常

标签 lucene elasticsearch elastic-stack

我不太确定为什么过滤器"term": {"language": "Austrian"}一词会导致 Elasticsearch 解析异常。

令人惊讶的是,如果删除了query_string查询,它会起作用。
如果不将"term": {"language": "Austrian"}过滤器放到哪里,该怎么办?

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "status_type": [
                  "1",
                  "2",
                  "7"
                ]
              }
            }
          ]
        }
      },
      "filter": {
        "query": {
          "query_string": {
            "fields": [
              [
                "name",
                "message"
              ]
            ],
            "query": "Arnold AND Schwarz"
          }
        },
        "term": {                <-- Causes parse exception
          "language": "Austrian"
        }
      }
    }
  },
  "sort": [
    {
      "total": {
        "order": "desc"
      }
    }
  ]
}

最佳答案

filter内部,如果您有多个约束,则需要 bool filter,这是您的情况,因为您有 query filter term filter。因此,正确的做法是这样的:

{
  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must": [
            {
              "terms": {
                "status_type": [
                  "1",
                  "2",
                  "7"
                ]
              }
            }
          ]
        }
      },
      "filter": {
        "bool": {               <---- add this
          "must": [             <---- and this
            {
              "query": {
                "query_string": {
                  "fields": [
                    [
                      "name",
                      "message"
                    ]
                  ],
                  "query": "Arnold AND Schwarz"
                }
              }
            },
            {
              "term": {
                "language": "Austrian"
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "total": {
        "order": "desc"
      }
    }
  ]
}

但是,如果我可以添加一些内容,我将以某种不同的方式重写查询,然后将query_string移至query部分,将status_type term移至filter部分,这会感觉更“自然”。另外,如果只有一个约束,则在query部分中不需要bool/must
{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "fields": [
            [
              "name",
              "message"
            ]
          ],
          "query": "Arnold AND Schwarz"
        }
      },
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "status_type": [
                  "1",
                  "2",
                  "7"
                ]
              }
            },
            {
              "term": {
                "language": "Austrian"
              }
            }
          ]
        }
      }
    }
  },
  "sort": [
    {
      "total": {
        "order": "desc"
      }
    }
  ]
}

关于lucene - 添加术语过滤器时的 Elasticsearch 查询解析异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31843878/

相关文章:

elasticsearch - 用于提取URI一部分的grok模式

docker - 连接两个 docker-compose 实例

lucene - 如何将文档索引到特定的ElasticSearch分片?

java - 如何读取 Lucene 索引?

Elasticsearch/Logstash 错误 : com. mysql.jdbc.Driver 未加载 - 无法在服务器上找到 mysql-connector-java-5.1.36-bin.jar

ubuntu - Fluentd、Elasticsearch 和 Kibana 设置

elasticsearch - 对具有一定日期范围的索引进行 Elasticsearch 查询

java - 从 Lucene 标准分析器中删除空格字符

java - 使用 Lucene IndexableField 在运行时出现 NoClassDefFoundError

elasticsearch - 弹性,我可以将我自己的全局序号与无痛术语聚合脚本一起使用吗?