从ElasticSearch的搜索中排除词组

时间:2019-04-22 17:11:42

标签: elasticsearch elasticsearch-dsl elasticsearch-dsl-py

我正在使用ElasticSearch(elasticsearch-dsl)并搜索关键字,但想忽略搜索中的某些短语。例如。搜索"best"并忽略词组"best regards": 它应该找到文档“ Best汽车bla-bla-bla最佳问候”(第一个匹配是正确的,第二个忽略了),但不应该匹配“ Bla-bla-bla最佳问候”。 理想情况下,它也应该只突出实际匹配,而忽略短语中不包含单词。 我正在考虑启动2个查询,然后从实际搜索中删除忽略短语的结果。是否可以通过某种方式获得匹配令牌及其位置的列表?还是有更好的方法?我无法在索引中添加停止短语,因为搜索是动态的,并且忽略短语会因用户而异。

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全了解您的方法 但是,听起来您想将一个不能与确切词组匹配组合在一起的查询添加到查询中。 看起来像这样:

{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "text_field" : "best" }
      },
      "must_not" : {
        query_string: {default_field: "text_field", query: '\"best regards\"'}
      },
   }
}

如果您要排除多个短语,则字符串语法为:

'\"text"\ OR \"text1"\ OR ... \"textn\"'

我还花了一些时间认识到Elasticsearch custom analyzers的强大功能,我不确定您的数据看起来如何以及您的需求是什么,但是如果没有,您应该看看它,它可以为您省去很多麻烦,并使查询效率更高。