addHighlightedField()方法不适用于Elasticsearch中的termsQuery

时间:2016-08-09 06:33:29

标签: elasticsearch

我在ES服务器中有一个名为blog的索引。它的类型为article。每个文档属于blog/article都有三个字段:titleabstractcontent。例如:

{
  "_index": "blog",
  "_type": "article",
  "_id": "2",
  "_score": 1,
  "_source": {
     "id": 2,
     "title": "Install Git on Windows",
     "abstract": " Git Installation guide",
     "content": "Git is easy to learn and has a tiny ... "
  }
}

我构建了一个termsQuery来搜索包括git

在内的文档
QueryBuilder termquery1 = QueryBuilders.termsQuery("_all", "git");
SearchResponse response1 =client.prepareSearch().setQuery(termquery1)
                          .addHighlightedField("title")
                          .execute().actionGet();
SearchHits hits = response1.getHits();
for (SearchHit hit : hits) {
        HighlightField hField=hit.getHighlightFields().get("title");
        System.out.println(hit.getSource() + "\t" + hit.getHighlightFields());
       System.out.println(hField);
}

System.out.println(hField)打印null,我的目标是在所有字段中突出显示关键字git。如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

我阅读了elasticsearch reference Elasticsearch Reference [2.3] » Mapping » Meta-Fields » _all field#highlighting-all-field并找到了原因。

  

突出显示和_all字段

     

字段只能用于突出显示原始字符串值   可以从_source字段或作为存储字段使用。

     

_source字段中不存在_all字段,而不是.all字段   默认存储,因此无法突出显示。那里有两个   选项。存储_all字段或突出显示原始字段。

     

存储_all fieldingit

     

如果store设置为true,则为原始   字段值是可检索的,可以突出显示。

我将映射更改为设置_all

{
 "blog": {
     "mappings": {
         "article": {
             "_all": {
                 "store": true,
                "analyzer": "ik_max_word"
             }
         }
     }
 }
}

然后我将termsQuery更改为queryStringQuery:

QueryBuilder strQuery = QueryBuilders.queryStringQuery("git");

然后更改搜索方法:

SearchResponse response1 = client.prepareSearch()
                                 .addHighlightedField("_all")
                                 .setHighlighterPreTags("<span color=\"red\">")
                                 .setHighlighterPostTags("</span>")
                                 .setQuery(strQuery).execute().actionGet();

for (SearchHit hit : hits) {
                    HighlightField hField=hit.getHighlightFields().get("_all");
                    System.out.println("score:"+hit.getScore()+"id:"+hit.getId()
                                       +"\n"+hit.getSourceAsString());
                    System.out.println(hField);
                }