弹性搜索关键字不匹配

时间:2017-10-23 09:57:58

标签: javascript node.js elasticsearch

我正在弹性搜索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);
        }
      }});
  });
};

`

2 个答案:

答案 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);
        }
      }});
  });
};