(作者:www.data-master.net 数据极)
问题:
我是使用elastic search的新手,我想知道如何进行指定一个或多个字段的搜索。
使用SQL我会写这个查询:
"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'"
在elastic search中,我是这么做的:
{
"query": {
"filtered": {
"query": {
"query_string": {
"query": "*"
}
},
"filter": {
"term" : {
"field1" : "286"
}
}
}
}
}
(作者:www.data-master.net 数据极)
回答1:
您需要为job选择正确的查询,这在开始时可能很难。您可以使用bool查询将各种不同的查询组合在一起。还有一些查询允许在多个字段上执行,并在内部映射到布尔查询。
此外,术语查询在生产系统中并不常见,因为它们不支持任何文本分析,而我们通常希望用与索引字段的索引方式类似的方式分析查询。
elastic search中最常见的查询之一是匹配查询,它适用于单个字段。还有另一个查询具有一些options,这些options也适用于多个字段,称为multi_match。这些查询支持文本分析并且做得非常好。我建议在query_string查询中使用它们,但是因为需要解析过程,它更强大也更容易出错。我会说只有在你特别需要它的某些特性时才使用query_string(例如,在查询本身中指定字段名称或布尔运算符),否则请进行匹配查询。
了解查询和过滤器之间的区别也很重要,请查看此处了解更多信息。
并查看查询DSL中可用的所有查询并使用这些查询,只是为了感受您可以做的所有不同的事情。
回答2:
sql查询相当于:
{
"query": {
"bool": {
"must": [
{
"term": {
"field1": "X"
}
},
{
"term": {
"field3": "Z"
}
}
],
"must_not": {
"term": {
"field2": "Y"
}
}
}
}
}
无论如何,如果你是新手,我建议你在开始使用elasticsearch之前阅读一些文档。
有很多类型的查询,其中一些取决于您如何建立数据索引,例如对于字符串,您可以在索引时分析字符串(小写,词干,删除停用词…)。如果您在索引时分析该字段并将其转换为小写,我发布的查询将永远不会匹配其field1为“X”的doc。
一旦您了解了更好的elastic search,您就可以使用过滤器来改进查询。
回答3:
我建议从Elastic的简单查询开始。它更像SQL,更容易理解。链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html
查询语法看起来像,例如,如果您正在尝试查找名为John AND姓氏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