我在ES服务器中有一个名为blog
的索引。它的类型为article
。每个文档属于blog/article
都有三个字段:title
,abstract
和content
。例如:
{
"_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
。如何实现这一目标?
答案 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);
}