基于elasticsearch中的term或bool查询匹配突出显示

时间:2015-12-05 11:03:49

标签: python search elasticsearch pyelasticsearch

我有两个问题。

{'bool':
    {'must':
        { 'terms': 'metadata.loc':['ten','twenty']}
        { 'terms':  'metadata.doc':['prince','queen']}
     }
     {'should':         
         { 'match': 'text':'kingdom of dreams'}
     }
},
{'highlight':
     {'text':
         {'type':fvh,
          'matched_fields':['metadata.doc','text']
         }
      }
 }

有两个问题?

  1. 为什么带有查询匹配的文档会突出显示,而只有必须匹配的文档才会突出显示。

  2. 是否有任何方法可以提及特定于上述术语查询的突出显示条件?

  3. 这意味着突出{ 'terms': 'metadata.loc':['ten','twenty']}

    的条件

    { 'terms': 'metadata.doc':['prince','queen']}

    的单独突出显示条件

1 个答案:

答案 0 :(得分:1)

1)只有带有应该查询的文档才会突出显示,因为您只针对text字段进行突出显示,这基本上是您的应用子句。虽然您使用的是matched_fields,但您只考虑text字段。

来自Docs

  

所有matched_fields必须将term_vector设置为with_positions_offsets,但仅加载组合匹配的字段,因此只有该字段可以从存储设置为yes中受益。

此外,您正在组合两个非常不同的字段'matched_fields':['metadata.doc','text'],这很难理解,再次来自文档

  

从技术上讲,将字段添加到不与共享匹配的字段共享相同底层字符串的matched_fields也可以。结果可能没有多大意义,如果其中一个匹配项不在文本的末尾,则整个查询将失败。

2)您可以使用Highlight Query

编写特定于术语查询的突出显示条件

在查询的highlight部分中尝试此操作

{
  "query": {
    ...your query...
  },
  "highlight": {
    "fields": {
      "text": {
        "type": "fvh",
        "matched_fields": [
          "text",
          "metadata.doc"
        ]
      },
      "metadata.doc": {
        "highlight_query": {
          "terms": {
            "metadata.doc": [
              "prince",
              "queen"
            ]
          }
        }
      },
      "metadata.loc": {
        "highlight_query": {
          "terms": {
            "metadata.loc": [
              "ten",
              "twenty"
            ]
          }
        }
      }
    }
  }
}

这有帮助吗?