使用荧光笔和Bool查询的弹性搜索2.0 / 2.1问题

时间:2015-11-30 17:24:27

标签: elasticsearch highlight booleanquery

我遇到了在Elastic 2.0和2.1中突出显示的问题 - 它返回的信息比我认为的要多。

我正在构建一个bool查询(过滤的查询关键字在2.0+中已弃用,因此我尝试更新我的语法)。我正在查询中构建必须部分和过滤器部分,然后请求突出显示信息。

文档说要在查询上下文或过滤器上下文中使用查询,但是荧光笔似乎并不表示这种区别。

这是我完全形成的查询:

GET /sample04/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "query": { "query_string": { "query": "east west" } }
                }
            ],
            "filter": [
                {
                    "terms": {"OwnerId": ["1", "2","3"]}
                }
            ]
        }
    },
    "highlight": {
        "fields": {
            "*": { "require_field_match": "false" }
        }
    }
}

所以这个查询按预期工作 - 我们正在查询东西方的术语,我们在Id字段上过滤文档,这是我们安全要求的一部分,然后我要求突出显示信息。

然而,缺点是突出显示的信息包含我在我的过滤器中提交的每个值的每个实例(在本例中为1,2或3),它匹配文档任何部分中任何字段的任何值,如这个:

 "highlight": {
               "SomeTextField": [
                  "North <em>West</em>"
               ],
               "OwnerId": [
                  "<em>3</em>"
               ],
               "SerialNumber": [
                  "<em>3</em>-<em>3</em>"
               ],
               "AssociatedValue": [
                  "<em>3</em>",
                  "<em>2</em>"
               ],
               "RelatedValue": [
                  "<em>3</em>",
                  "<em>3</em>",
                  "<em>3</em>",
                  "<em>3</em>",
                  "<em>3</em>"
               ]
            }

如何在必须部分中使用荧光笔来匹配我的查询,但忽略过滤器?我认为它应该忽略作为过滤器一部分的突出显示匹配,特别是当它突出显示包含值的字段被请求过滤特定字段时,但它在我的文档中的任何位置使用该值。这在某种程度上似乎是错误的,但也许这是我的理解。

作为一个FYI,如果我将require_field_match设置为TRUE,那么我只会获得与过滤器匹配的匹配,以及与查询匹配的NONE。

我无法指定一个字段来生成突出显示信息,而我们使用Elastic作为搜索一旦找到任何模型,所以我不知道字段我的结果将从中返回。

你能看出我做错了什么吗?理解这一点将非常感激。

1 个答案:

答案 0 :(得分:2)

您可以使用highlight query来实现此目的。将您的高亮部分更改为

"highlight": {
    "fields": {
      "*": {
        "highlight_query": {
          "query_string": {
            "query": "east west"
          }
        }
      }
    }
  }