个人专题目录](//www.greatytc.com/p/140e2a59db2c)
1. elasticsearch高亮(highlight search)
1.1 高亮介绍
许多应用都倾向于在每个搜索结果中 高亮 显示搜索的关键词,比如字体的加粗,改变字体的颜色等.以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。
高亮显示需要一个字段的实际内容。 如果该字段没有被存储(映射mapping没有将存储设置为 true),则加载实际的_source,并从_source中提取相关的字段。
在 Elasticsearch 中检索出高亮片段很容易。
再次执行前面的查询,并增加一个新的 highlight
参数:
POST /book-index/_search
{
"from": 0,
"size": 100,
"query": {
"match": {
"title": {
"query": "三星",
"operator": "OR",
"prefix_length": 0,
"max_expansions": 50,
"fuzzy_transpositions": true,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": true,
"boost": 1
}
}
},
"highlight": {
"pre_tags": [
"<b><font color=red>"
],
"post_tags": [
"</font></b>"
],
"require_field_match": false,
"fields": {
"title": {}
}
}
}
当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight
的部分。这个部分包含了 about
属性匹配的文本片段,并以 HTML 标签 <em></em>
封装:
可以看到,除了从ES中得到标准信息以外,还有一个新命名的highlight的部分。这里ES使用<em>的这HTML标签作为highlight部分的开始,使用<//em>标识其结束。
1.2 高亮使用
highlight参数:
下面的参数可以改变返回的结果。即可以为单独的字段设置不同的参数,也可以作为 highlight 的属性统一定义。
number_of_fragments
fragment 是指一段连续的文字。返回结果最多可以包含几段不连续的文字。默认是5。
fragment_size
某字段的值,长度是1万,但是我们一般不会在页面展示这么长,可能只是展示一部分。设置要显示出来的fragment文本判断的长度,默认是100
noMatchSize
搜索出来的这个文档这个字段已经显示出高亮的情况,可是其它字段并没有任何显示,设置这个属性可以显示出来。
pre_tags
标记 highlight 的开始标签。例如上面的<em>。
post_tags
标记 highlight 的结束标签。例如上面的</em>。
@Override
public void highLightQuery(String indexName, String field, String keyword, Integer fragmentSize, Integer numOfFragments,Integer noMatchSize) throws Exception {
//条件
MatchQueryBuilder queryBuilder = new MatchQueryBuilder(field, keyword);
// 高亮设置
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(false).field(field)
.preTags("<b><font color=red>")
.postTags("</font></b>");
highlightBuilder.fragmentSize(fragmentSize);
highlightBuilder.numOfFragments(numOfFragments);
highlightBuilder.noMatchSize(noMatchSize);
baseQuery.builder(indexName, queryBuilder, highlightBuilder);
}
@Test
public void testHighLightQuery() throws Exception {
//20 2 150
highLightQuery.highLightQuery(Constants.INDEX_NAME, "title", "三星", null, null, null);
}