使用弹性搜索在多个字段中搜索

Pen*_*e83 29 json elasticsearch

我是弹性搜索新手,我想知道如何进行搜索,指定一个或多个字段.

使用SQL我会写这个查询:

"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'"
Run Code Online (Sandbox Code Playgroud)

在弹性搜索中,我从这开始:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "*"
                }
            },
            "filter": {
                "term" : {
                    "field1" : "286"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mol*_*are 35

sql查询相当于:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "field1": "X"
          }
        },
        {
          "term": {
            "field3": "Z"
          }
        }
      ],
      "must_not": {
        "term": {
          "field2": "Y"
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,如果你是新手,我建议你在开始使用elasticsearch之前阅读一些文档.

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

一旦您了解了更好的弹性搜索,您就可以使用过滤器来改进查询.


jav*_*nna 26

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

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

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

并查看查询DSL中可用的所有查询并使用这些查询,只是为了感受您可以做的所有不同的事情.

  • 如何将“multi_match”与“match_phrase_prefix”结合起来?我想在多个字段中搜索子字符串。它不必匹配所有字段,只要它存在于其中之一即可。 (2认同)