[英]Search on multiple fields with Elasticsearch
我是 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"
}
}
}
}
}
sql查询等价于:
{
"query": {
"bool": {
"must": [
{
"term": {
"field1": "X"
}
},
{
"term": {
"field3": "Z"
}
}
],
"must_not": {
"term": {
"field2": "Y"
}
}
}
}
}
无论如何,如果您是新手,我建议您在开始使用 elasticsearch 之前阅读一些文档。
有很多类型的查询,其中一些取决于您如何索引数据,例如对于字符串,您可以在索引时分析字符串(小写、词干、删除停用词等)。 如果您在索引时分析该字段并将其转换为小写,我发布的查询将永远不会匹配 field1 为“X”的文档。
一旦您了解了一些更好的 elasticsearch,您就可以使用过滤器来改进您的查询。
您需要为工作选择正确的查询,这在开始时可能很困难。 您绝对可以使用 bool 查询将各种不同的查询组合在一起,就像已经建议的那样。 还有一些查询允许在多个字段上执行,并在内部映射到布尔查询。 此外, 术语查询在生产系统中并不常见,因为它们不支持任何文本分析,而您通常希望以类似于索引查询字段的方式来分析查询。
elasticsearch 中最常见的查询之一是匹配查询,它适用于单个字段。 还有另一个具有相同选项的查询,它也适用于多个字段,称为multi_match 。 这些查询支持文本分析并且工作得非常好。 例如,我建议在 query_string 查询上使用它们,由于需要的解析过程,它功能更强大但也容易出错。 我会说仅当您特别需要它的功能之一时才使用 query_string(例如,在查询本身中指定字段名称或布尔运算符),否则使用匹配查询。
了解查询和过滤器之间的区别也很重要,请查看此处了解更多信息。
如果您想在多个字段上搜索相同的值,那么您可以尝试
{"query": {"multi_match": {"query": "querystring", "fields": ["name", "description"]}}}
用您的搜索关键字替换querystring
我建议从 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.