使用Elasticsearch在多个字段上进行搜索

39

我刚接触 Elasticsearch,想知道如何指定一个或多个字段进行搜索。

如果使用 SQL,我会这样写查询语句:

"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'"

在Elasticsearch中,我从这里开始:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "*"
                }
            },
            "filter": {
                "term" : {
                    "field1" : "286"
                }
            }
        }
    }
}
4个回答

41

该 SQL 查询等同于:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "field1": "X"
          }
        },
        {
          "term": {
            "field3": "Z"
          }
        }
      ],
      "must_not": {
        "term": {
          "field2": "Y"
        }
      }
    }
  }
}

如果你是新手,我建议你在开始使用Elasticsearch之前先阅读一些文档。查询类型有很多种,其中一些取决于数据索引的方式。例如,对于字符串,您可以在索引时分析字符串(小写、词干提取、去除停用词等)。如果您在索引时分析并将字段1转换为小写,则我发布的查询将永远不会匹配字段1为“X”的文档。

了解了Elasticsearch后,您还可以使用过滤器来改进查询。


如果我想要在field1中搜索“X”和“Q”,我该怎么办?我尝试了类似这样的代码:“field1”:[“X”,“Q”],但是没有起作用。 - codeBarer
@codeBarer 使用术语查询而不是术语查询。请参阅此处 => http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html - moliware
我相信你可以使用“match”代替“term”! - Agent 0

36

你需要选择适合任务的查询,这在一开始可能很难。您可以使用bool查询将各种不同的查询组合在一起,如先前建议的。还有一些查询允许在多个字段上执行,并在内部映射为布尔查询。此外,术语查询在生产系统中并不常见,因为它们不支持任何文本分析,而您通常希望以类似于查询字段的索引方式分析查询。

Elasticsearch中最常见的查询之一是match查询,它适用于单个字段。还有另一个具有完全相同选项的查询,也可以在多个字段上工作,称为multi_match。这些查询支持文本分析并且运行得非常好。我建议使用它们替代query_string查询,后者更强大但也容易出错,因为需要解析过程。如果没有特殊要求(例如在查询本身中指定字段名称或布尔运算符),则应使用匹配查询。

还要了解查询和过滤器之间的区别,请参见此处了解更多信息。

请查看查询DSL中提供的所有查询并尝试使用它们,以了解可以执行的各种不同操作。


1
除了写得非常好之外,这篇文章非常有帮助。感谢您的解释和链接到来源。 - Andreas Kavountzis
欢迎,感谢您的好评@AndreasKavountzis! - javanna
2
你如何将 multi_matchmatch_phrase_prefix 结合使用?我想在多个字段中搜索子字符串。它不必匹配所有字段,只要存在于其中一个字段中即可。 - Chrillewoodz
更新的链接:term queriesmulti_matchthe query DSL - Jeroen

1
如果您想在多个字段中搜索相同的值,则可以尝试:
{"query": {"multi_match": {"query": "querystring", "fields": ["name", "description"]}}}

用你的搜索关键字替换querystring


0

我建议从Elastic的简单查询开始。它更像SQL,更容易理解。链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

查询语法看起来像这样,例如,如果您想查找名为John且姓为Doe的客人:

GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "John + Doe",
        "fields": ["guest"],
        "default_operator": "and"
    }
  }
}

如果任何一个条件不匹配,查询将返回零结果。此外,在这里您可以在多个字段上搜索,但与在单个字段上搜索相比,速度会较慢。另外,根据文档,简单查询支持特殊符号作为逻辑/搜索运算符:

 '+' signifies AND operation | signifies OR operation
 '-' negates a single token " wraps a number of tokens to signify a phrase for searching
 '*' at the end of a term signifies a prefix query

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接