【问题标题】:Search on multiple fields with Elasticsearch使用 Elasticsearch 搜索多个字段
【发布时间】:2013-09-12 18:28:09
【问题描述】:

我是 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"
                }
            }
        }
    }
}

【问题讨论】:

    标签: json elasticsearch


    【解决方案1】:

    sql查询相当于:

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

    无论如何,如果您是新手,我建议您在开始使用 elasticsearch 之前先阅读一下文档。

    有很多类型的查询,其中一些取决于您如何索引数据,例如对于字符串,您可以在索引时分析字符串(小写、词干、删除停用词等)。如果您在索引时分析该字段并将其转换为小写,我发布的查询将永远不会匹配 field1 为“X”的文档。

    一旦您对 elasticsearch 有所了解,您就可以使用过滤器来改进您的查询。

    【讨论】:

    • 如果我想在 field1 中搜索“X”和“Q”怎么办?我厌倦了类似的东西:“field1”:[“X”,“Q”]但没有工作
    • @codeBarer 使用术语查询而不是术语查询。看看这个 => elasticsearch.org/guide/en/elasticsearch/reference/current/…
    • 我相信你也可以使用 match 而不是 term!
    【解决方案2】:

    您需要为工作选择正确的查询,这在一开始可能很难。您绝对可以使用 bool 查询将各种不同的查询组合在一起,就像已经建议的那样。还有一些查询允许在多个字段上执行,并在内部映射到布尔查询。此外,term queries 在生产系统中并不常见,因为它们不支持任何文本分析,而您通常希望以类似于您为正在查询的字段编制索引的方式来分析查询。

    elasticsearch 中最常见的查询之一是匹配查询,它适用于单个字段。还有另一个具有相同选项的查询也适用于多个字段,称为multi_match。这些查询支持文本分析并且工作得非常好。例如,我建议在 query_string 查询上使用它们,由于需要解析过程,它更强大但也容易出错。我会说只有在您特别需要它的一项功能时才使用 query_string(例如,在查询本身中指定字段名称或布尔运算符),否则请使用匹配查询。

    了解查询和过滤器之间的区别也很重要,请查看here 了解更多信息。

    请查看the query DSL 提供的所有查询并尝试使用这些查询,以了解您可以做的所有不同事情。

    【讨论】:

    • 这篇文章除了写得好之外,还非常有帮助。感谢您的解释和来源链接。
    • 不客气,感谢您的好评@AndreasKavountzis!
    • 如何将multi_matchmatch_phrase_prefix 结合起来?我想在多个字段中搜索子字符串。它不必匹配所有字段,只要它存在于其中一个字段中即可。
    【解决方案3】:

    如果您想在多个字段中搜索相同的值,那么您可以尝试

    {"query": {"multi_match": {"query": "querystring", "fields": ["name", "description"]}}}
    

    用您的搜索关键字替换querystring

    【讨论】:

      【解决方案4】:

      我建议从 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
      

      【讨论】:

        猜你喜欢
        • 2018-12-22
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多