個(gè)人專題目錄](méi)(http://www.reibang.com/p/140e2a59db2c)
1. elasticsearch高亮(highlight search)
1.1 高亮介紹
許多應(yīng)用都傾向于在每個(gè)搜索結(jié)果中 高亮 顯示搜索的關(guān)鍵詞莺掠,比如字體的加粗,改變字體的顏色等.以便讓用戶知道為何該文檔符合查詢條件喇伯。在 Elasticsearch 中檢索出高亮片段也很容易。
高亮顯示需要一個(gè)字段的實(shí)際內(nèi)容作郭。 如果該字段沒(méi)有被存儲(chǔ)(映射mapping沒(méi)有將存儲(chǔ)設(shè)置為 true)叁温,則加載實(shí)際的_source祷膳,并從_source中提取相關(guān)的字段客叉。
在 Elasticsearch 中檢索出高亮片段很容易丘喻。
再次執(zhí)行前面的查詢脯宿,并增加一個(gè)新的 highlight
參數(shù):
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": {}
}
}
}
當(dāng)執(zhí)行該查詢時(shí),返回結(jié)果與之前一樣泉粉,與此同時(shí)結(jié)果中還多了一個(gè)叫做 highlight
的部分连霉。這個(gè)部分包含了 about
屬性匹配的文本片段,并以 HTML 標(biāo)簽 <em></em>
封裝:
可以看到嗡靡,除了從ES中得到標(biāo)準(zhǔn)信息以外跺撼,還有一個(gè)新命名的highlight的部分。這里ES使用<em>的這HTML標(biāo)簽作為highlight部分的開(kāi)始讨彼,使用<//em>標(biāo)識(shí)其結(jié)束歉井。
1.2 高亮使用
highlight參數(shù):
下面的參數(shù)可以改變返回的結(jié)果。即可以為單獨(dú)的字段設(shè)置不同的參數(shù)哈误,也可以作為 highlight 的屬性統(tǒng)一定義哩至。
number_of_fragments
fragment 是指一段連續(xù)的文字躏嚎。返回結(jié)果最多可以包含幾段不連續(xù)的文字。默認(rèn)是5憨募。
fragment_size
某字段的值紧索,長(zhǎng)度是1萬(wàn),但是我們一般不會(huì)在頁(yè)面展示這么長(zhǎng)菜谣,可能只是展示一部分珠漂。設(shè)置要顯示出來(lái)的fragment文本判斷的長(zhǎng)度,默認(rèn)是100
noMatchSize
搜索出來(lái)的這個(gè)文檔這個(gè)字段已經(jīng)顯示出高亮的情況尾膊,可是其它字段并沒(méi)有任何顯示媳危,設(shè)置這個(gè)屬性可以顯示出來(lái)。
pre_tags
標(biāo)記 highlight 的開(kāi)始標(biāo)簽冈敛。例如上面的<em>待笑。
post_tags
標(biāo)記 highlight 的結(jié)束標(biāo)簽。例如上面的</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);
// 高亮設(shè)置
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);
}