我在Elasticsearch中遇到结果突出显示问题。我的查询有效,它确实返回结果,但它们没有突出显示...所以我一直在搜索,但我找不到我做错了什么!
这是我的代码:
function search(searchInput){
emptyTable();
client.search({
index: 'movies',
size: 5,
body: {
query: {
//match: {_all: searchInput}
"term": {
"_all" : searchInput
}
},
"highlight": {
"require_field_match": true,
"fields": {
"_all": {
"pre_tags": [
"<b>"
],
"post_tags": [
"</b>"
]
}
}
}
}
}).then(function (resp) {
var hits = resp.hits.hits;
var hitcount = resp.hits.total;
if(!jQuery.isEmptyObject(hits)){
console.log(hits);
$.each(hits, function(key,obj) {
if(key%2==0){
$('#table').append('<tr><td>'+obj._source.imdbid+'</td><td>'+obj._source.name+'</td><td>'+obj._source.desc+'</td></tr>');
}else{
$('#table').append('<tr class="even"><td>'+obj._source.imdbid+'</td><td>'+obj._source.name+'</td><td>'+obj._source.desc+'</td></tr>');
}
});
}
$('#count').html("Aantal resultaten: "+hitcount);
});
}
我正在搜索数据,然后把它放在一个表中,工作正常。但突出显示根本不起作用。请帮帮我!
答案 0 :(得分:2)
我遇到了同样的问题,事实证明,当你指定高亮度参数时,elasticsearch不仅会返回&#39; _source&#39;领域,但也突出&#39;领域。经过进一步检查,ES docs似乎证实了这一点:
每个搜索命中都会有另一个元素,称为高亮显示,其中包含突出显示的字段和突出显示的片段
因此,为了实现这一目标,您需要交换“_source&#39;为了突出显示&#39;在你的代码中:
<td>'+obj.highlight.name+'</td>
我还发现ES也将高亮响应放在方括号中,所以在我的例子中,(使用AngularJS)我按如下方式访问了值:
// ...ng-repeat=result in results...
<p ng-bind-html="result.highlight.body[0]">{{result.highlight.body[0]}}</p>
答案 1 :(得分:1)
ES 2.2的工作版本。 在查询的突出显示部分使用
require_field_match:false,
function search(searchInput){
emptyTable();
client.search({
index: 'movies',
size: 5,
body: {
query: {
//match: {_all: searchInput}
term: {
_all: searchText
}
},
highlight: {
require_field_match: false,
fields: {
"*": {
"pre_tags": [
"<b>"
],
"post_tags": [
"</b>"
]
}
}
}
}
}).then(function (resp) {
var hits = resp.hits.hits;
var hitcount = resp.hits.total;
if(!jQuery.isEmptyObject(hits)){
console.log(hits);
$.each(hits, function(key,obj) {
if(key%2==0){
// All highlight fields here...
$('#table').append('<tr><td>'+obj.highlight.imdbid+'</td><td>'+obj.highlight.name+'</td><td>'+obj.highlight.desc+'</td></tr>');
}else{
$('#table').append('<tr class="even"><td>'+obj._source.imdbid+'</td><td>'+obj._source.name+'</td><td>'+obj._source.desc+'</td></tr>');
}
});
}
$('#count').html("Aantal resultaten: "+hitcount);
});
}
答案 2 :(得分:0)
更简单的版本也适用于我,elasticsearch 5,节点8.7,elasticsearch.js节点模块:
response = await client.search({
index: indexName,
type: indexType,
q: query,
highlight: {
fields: {
"*": {
"pre_tags": ["<b>"],
"post_tags": ["</b>"]
}
}
}
}