使用"and"运算符搜索多个字段(但使用字段自己的分析器)



ElasticSearch版本:0.90.2

问题是:我想在索引中找到文档,以便它们:

  1. 在多个字段中匹配所有查询令牌
  2. 字段使用自己的分析器

因此,如果有4个文档:

{ "_id" : 1, "name" : "Joe Doe",     "mark" : "1", "message" : "Message First" }
{ "_id" : 2, "name" : "Ann",         "mark" : "3", "message" : "Yesterday Joe Doe got 1 for the message First"}
{ "_id" : 3, "name" : "Joe Doe",     "mark" : "2", "message" : "Message Second" }
{ "_id" : 4, "name" : "Dan Spencer", "mark" : "2", "message" : "Message Third" }

查询是"Joe First 1",它应该找到id 1和2。也就是说,它应该从搜索查询中找到包含所有令牌的文档,无论它们在哪个字段中(可能所有令牌都在一个字段中,也可能每个令牌都在自己的字段中)。

一种解决方案是使用弹性搜索"_all"字段功能:这样它将把我需要的所有字段(名称、标记、消息)合并为一个字段,我就可以用之类的东西来查询它

"match": {
  "_all": {
    "query": "Joe First 1",
    "operator": "and"
  }
}

但通过这种方式,我可以仅为"_all"字段指定分析器。我需要"name"one_answers"message"字段具有不同的标记器/标记过滤器集(假设name将具有语音分析器,message将具有一些词干标记过滤器)。

有办法做到这一点吗?

感谢elasticsearch小组的成员,以下是解决方案。。。很简单地说:)

我所需要做的就是使用query_string查询http://www.elasticsearch.org/guide/reference/query-dsl/query-string-query/如果default_operator=AND,它就会完成任务:

{
  "query": {
    "query_string": {
      "fields": [
        "name",
        "mark",
        "message"
      ],
      "query": "Joe First 1",
      "default_operator": "AND"
    }
  }
}

我认为在这里使用多匹配查询是有意义的。类似于:

"multi_match": {
    "query": "Joe First 1",
    "operator": "and"
    "fields": [ "name", "message", "mark"]
}

正如您所说,您可以设置要在_all字段上使用的analyzer(或search_analyzer/index_analyzer)。在我看来,这确实应该是实现您想要的查询结果的第一步。

发件人http://jontai.me/blog/2012/10/lucene-scoring-and-elasticsearch-_all-field/,我们有一个美味的报价:

all字段复制其他字段中的文本并进行分析他们再次;它不会复制预先分析的令牌。您可以设置all字段的单独分析器。

我认为这意味着您应该设置_all分析器以及单个字段分析器。_all字段不会重新分析单个字段数据;它将获取原始字段内容。

最新更新