Elasticsearch---DSL查询

文章目录

  • 1 查询和过滤上下文
    • 1.1 查询上下文
    • 1.2 过滤上下文
  • 2 全文检索 Full Text Search
  • 3 精准查询 Term level queries
  • 4 复合查询(Compound queries)
  • 总结

1 查询和过滤上下文

查询子句的行为取决于它是在查询上下文还是过滤器上下文中使用:

1.1 查询上下文

在查询上下文中使用的查询子句基于文档相关性原则进行查询,用于回答“文档匹配查询子句的程度”。查询结果列出所有相关文档并按照相关性评分进行排序。相关性评分有查询上下文中的查询子句计算出来,用_score表示,即相对于其他文档的匹配程度。

每当将查询子句传递给 query 参数(例如,search API中的 query 参数)时,查询上下文都有效。

1.2 过滤上下文

在过滤器上下文中,查询子句回答问题“此文档是否匹配此查询子句?”答案是一个简单的是或否——不计算得分。 过滤器上下文主要用于过滤结构化数据,例如:

timestamp 是否在2015年至2016年的范围内?status 字段是否设置为 “published” 常用的过滤器将由Elasticsearch自动缓存,以加快性能。

无论什么情况下将查询子句传递给过滤器参数时,过滤器上下文都有效,例如:bool 查询中的 filter 或 must_not 参数, constant_score 查询中的过滤器参数,或聚合 filter。

下面是在搜索API中的查询和过滤器上下文中使用的查询子句的示例。 此查询将匹配满足以下所有条件的文档:

title 字段包含单词 search
content 字段包含单词 elasticsearch。
status 字段包含 pulished 的确切字词。
publish_date 字段包含从2015年1月1日起的所有日期。

GET /_search
{
  "query": {"bool": {"must": [
        { "match": { "title":   "Search"        }},{ "match": { "content": "Elasticsearch" }}],
      "filter": [{ "term":  { "status": "published" }},{ "range": { "publish_date": { "gte": "2015-01-01" }}}]
    }
  }
}

① query 参数表示查询上下文。

②③④ 在查询上下文中使用 bool 和两个匹配子句,这意味着它们用于评估每个文档匹配的程度。

⑤ filter 参数指示过滤器上下文。

⑥⑦ term 和 range 子句在过滤器上下文中使用。 他们将过滤掉不匹配的文档,但不会影响匹配文档的分数。

注意 :

在查询上下文中使用查询子句,用于影响匹配文档的分数(即文档匹配的程度)的条件,在过滤器上下文中使用所有其他查询子句。

2 全文检索 Full Text Search

高级别的全文搜索通常用于在全文字段(例如:一封邮件的正文)上进行全文搜索。它们了解如何分析查询的字段,并在执行之前将每个字段的分析器(或搜索分析器)应用于查询字符串。
这样的查询有以下这些:

  • 1 匹配查询(match query)
    用于执行全文查询的标准查询,包括模糊匹配和词组或邻近程度的查询
  • 2 短语匹配查询(match_phrase query)
    与匹配查询类似,但是是用于更加精确的匹配相似的词组或单词。
  • 3 短语前缀匹配查询(match_phrase_prefix query)
    这是一种弱类型的查询,类似短语匹配查询,但是它对最终要查询的单词的前缀进行模糊匹配的查询
  • 4 多字段查询(multi_match query)
    可以用来对多个字段的版本进行匹配查询
  • 5 常用术语查询(common_terms query)
    可以对一些比较专业的偏门词语进行的更加专业的查询
  • 6 查询语句查询(query_string query)
    与lucene查询语句的语法结合的更加紧密的一种查询,允许你在一个查询语句中使用多个 特殊条件关键字(如:AND|OR|NOT )对多个字段进行查询,当然这种查询仅限专家用户去使用。
  • 7 简单查询语句(simple_query_string)
    是一种适合直接暴露给用户的简单的且具有非常完善的查询语法的查询语句
GET index/_search
{
  "query": {
    ***
  }
}
  • match:匹配包含某个term的子句

  • match_all:匹配所有结果的子句

  • multi_match:多字段条件

  • match_phrase:短语查询,

3 精准查询 Term level queries

虽然全文查询将在执行之前分析查询字符串,但是项级别查询对存储在反向索引中的确切项进行操作。
这些查询通常用于结构化数据,如数字、日期和枚举,而不是全文字段。或者,在分析过程之前,它允许你绘制低级查询。
这样的查询有以下这些:

  • 1 Term Query(项查询)
    查询包含在指定字段中指定的确切值的文档。
  • 2 Terms Query(多项查询)
    查询包含任意一个在指定字段中指定的多个确切值的文档。
  • 3 Range Query(范围查询)
    查询指定字段包含指定范围内的值(日期,数字或字符串)的文档。
  • 4 Exists Query(非空值查询)
    查询指定的字段包含任何非空值的文档。
  • 5 Prefix Query(前缀查询)
    查找指定字段包含以指定的精确前缀开头的值的文档。
  • 6 Wildcard Query(通配符查询)
    查询指定字段包含与指定模式匹配的值的文档,其中该模式支持单字符通配符(?)和多字符通配符(*)
  • 7 Regexp Query(正则表达式查询)
    查询指定的字段包含与指定的正则表达式匹配的值的文档。
  • 8 Fuzzy Query(模糊查询)
    查询指定字段包含与指定术语模糊相似的术语的文档。模糊性测量为1或2的 Levenshtein。
  • 9 Type Query(类型查询)
    查询指定类型的文档。
  • 10 Ids Query(ID查询)

term:匹配和搜索词项完全相等的结果

  • term和match_phrase区别:

    match_phrase 会将检索关键词分词, match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,而且默认必须都是连续的

    term搜索不会将搜索词分词

  • term和keyword区别

    term是对于搜索词不分词,

    keyword是字段类型,是对于source data中的字段值不分词

  • terms:匹配和搜索词项列表中任意项匹配的结果

  • range:范围查找

4 复合查询(Compound queries)

复合查询用来包装其他复合或者叶子查询,一方面可综合其结果和分数,从而改变它的行为,另一方面可从查询切换到过滤器上下文。此类查询包含:

  • 1 constant_score 查询
    这是一个包装其他查询的查询,并且在过滤器上下文中执行。与此查询匹配的所有文件都需要返回相同的“常量”_score。
  • 2 bool 查询
    组合多个叶子并发查询或复合查询条件的默认查询类型,例如must,should,must_not, 以及filter条件。 在must和should子句他们的分数相结合-匹配条件越多,预期越好-而must_not和filter子句在过滤器上下文中执行。
  • 3 dis_max 查询
    支持多并发查询的查询,并可返回与任意查询条件子句匹配的任何文档类型。与bool查询可以将所有匹配查询的分数相结合使用的方式不同的是,dis_max查询只使用最佳匹配查询条件的分数。
  • 4 function_score 查询
    使用函数修改主查询返回的分数,以考虑诸如流行度,新近度,距离或使用脚本实现的自定义算法等因素。
  • 5 boosting 查询
    返回匹配positive查询的文档,并且当减少文档的分数时其结果也匹配negative查询。
  • 6 indices 查询
    对指定的索引执行一个查询,对其他索引执行另一个查询。

总结

这是笔者对ES中的DSL方式查询的简单介绍,谢谢指正。

著作权归NoLongerConfused所有。商业转载请联系NoLongerConfused获得授权,非商业转载请注明出处。

你可能感兴趣的:(elasticsearch)