我正在弹性搜索DB中进行搜索操作。我需要的是,如果我为搜索提供关键字'react',如果关键字是'react-router',它应该只给出匹配关键字'react'的结果,结果应该只包含'react-router'。 问题是如果我给搜索关键字'react',也会检索匹配'react-router'关键字的结果。 有没有比match-phrase更好的选择,我尝试了regexp和wildcard但没有用。 如何解决这个问题
`const searchTags = (tag) => {
const answerPush = [];
return new Promise((resolve, reject) => {
client.search({
index : constants.QUESTIONNAIRE_INDEX,
type : constants.QUESTIONS_TYPE,
scroll : constants.SCROLL,
body : {
query : {
match_phrase : {
tags : tag
}
}
}
},
function getMoreUntilDone(err, res) {
if (err) {
reject(err);
return;
} else {
res.hits.hits.forEach(function(hit) {
answerPush.push(hit._source);
});
if (res.hits.total > answerPush.length) {
client.scroll({
scrollId: res._scroll_id,
scroll: constants.SCROLL
}, getMoreUntilDone);
} else {
const answerArray = [];
answerPush.map(val => {
answerArray.push(val);
});
const result = {
questions: answerArray
};
resolve(result);
}
}});
});
};
`
答案 0 :(得分:1)
要按完全匹配进行搜索,您必须使用术语查询。
并且它可能在您的情况下运作良好,请记住,Elasticsearch将分析/索引您的字符串,例如react-redux将" splitted"因为" - "
而在两个关键字中您需要在映射中配置策略: https://discuss.elastic.co/t/how-to-search-for-terms-containing-hyphen-on--all-field/81335
答案 1 :(得分:-1)
使用术语查询代替匹配词组查询
const searchTags = (tag) => {
const answerPush = [];
return new Promise((resolve, reject) => {
client.search({
index : constants.QUESTIONNAIRE_INDEX,
type : constants.QUESTIONS_TYPE,
scroll : constants.SCROLL,
body : {
query : {
term : {
tags : tag
}
}
}
},
function getMoreUntilDone(err, res) {
if (err) {
reject(err);
return;
} else {
res.hits.hits.forEach(function(hit) {
answerPush.push(hit._source);
});
if (res.hits.total > answerPush.length) {
client.scroll({
scrollId: res._scroll_id,
scroll: constants.SCROLL
}, getMoreUntilDone);
} else {
const answerArray = [];
answerPush.map(val => {
answerArray.push(val);
});
const result = {
questions: answerArray
};
resolve(result);
}
}});
});
};