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

时间:2016-01-29 01:47:04

标签: elasticsearch

我有一个简单的文档,其中包含一个名为“keywords”的字段,该字段是为文本搜索编制索引的。关键字是一系列单词和短语,如下所示:

{“keywords”:[“restaurant manager”,“chef”,“bus boy”]}

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

示例:

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

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

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

  • “chef”应该返回此文档。

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

  • “餐厅经理无关的话”应该返回此文件。

  • “餐厅经理巴士”应该退回此文件,但理想情况下,不应该比“餐厅经理”得分更高。

评分很重要,所以我需要将其作为查询而不是过滤器。

我正在使用Elasticsearch 1.7。

1 个答案:

答案 0 :(得分: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,一个用于searching。需要keyword_analyzer来对术语进行索引,以便 manager 的查询不会返回带有餐厅经理的文档。有关keyword analyzer的更多信息。现在搜索需要shingle filter从输入文本生成phrases。像的文字这个餐厅经理很友好将被分成这家餐厅餐厅经理经理等你和你将得到预期的结果。您可以使用analyze 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"
    }
  }
}

希望这有帮助!