一尘不染

Elasticsearch:如果查询在索引数组中至少包含一项中的所有单词,如何只返回文本搜索查询的结果?

elasticsearch

我有一个简单的文档,其中包含一个名为“关键字”的字段,该字段被索引用于文本搜索。关键字是单词和短短语的数组,如下所示:

{“关键字”:[“餐厅经理”,“厨师”,“公共汽车男孩”]}

查询必须包含文档关键字中至少一项的所有单词,以便返回该文档。

例子:

  • “经理”不应返回此文档。

  • “ bus”和“ manager”不应返回此文档。

  • “餐厅经理”应返回此文档。

  • “ chef”应返回此文档。

  • “餐厅经理厨师”应返回此文档,并获得更高的分数。

  • “餐厅经理无关字词”应返回此文档。

  • “餐厅经理巴士”应返回此文档,但理想情况下,其得分不应高于“餐厅经理”。

评分很重要,因此我需要使其成为查询而不是过滤器。

我正在使用Elasticsearch 1.7。


阅读 347

收藏
2020-06-22

共1个答案

一尘不染

这可以通过以下设置来实现。

POST your_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "keyword_analyzer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ],
          "tokenizer": "keyword"
        },
        "shingle_analyzer":{
          "type" : "custom",
          "filter" :["lowercase","shingle_filter"],
          "tokenizer" : "standard"
        }
      },
      "filter": {
        "shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 5
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "keywords": {
          "type": "string",
          "index_analyzer": "keyword_analyzer",
          "search_analyzer": "shingle_analyzer"
        }
      }
    }
  }
}

在这里,由于需求analyzers,我使用了两种不同的方法,一种用于indexing和一种用于searchingkeyword_analyzer需要按原样索引该词,以便对
经理的 查询不会与 饭店经理
一起返回文档。有关关键字分析器的更多信息。现在,搜索需要带状滤波器phrases从输入文本生成。像 This restaurant manager那样的
文本将被分成 This restaurantrestaurant managermanager is
等等,您将获得期望的结果。您可以使用分析API来查看分析器的工作方式。

您可以像这样索引文档

PUT your_index/your_type/1
{
  "keywords": ["restaurant manager", "chef", "bus boy"]
}

这种类型的查询将为您提供文件

GET your_index/_search
{
  "query": {
    "match": {
      "keywords": "This restaurant manager is also a good chef"
    }
  }
}

希望这可以帮助!

2020-06-22