基本知识

查询结果返回设置:版本值、得分限制、定制返回字段

{
"version":true,
"min_score":0.75,
"fields":["a", "b"],
"query":{
...
}
}

定制字段的返回,从性能角度考虑,不如直接返回_source

搜索类型

通过search_type设置,请求类型是:

  1. query_then_fetch:默认设置。第一步在所有分片上执行查询得到对文档进行排序和分级所需信息,然后,在相关分片上查询文档的实际内容。该查询类型返回结果的最大数量等于size参数的值。
  2. query_and_fetch:最快最简单的搜索类型,所有分片并行查询,每个分片返回等于size值得结果数。
  3. dfs_query_and_fetch:相比query_and_fetch多包含一个额外阶段,在初始查询中执行分布式词频计算,返回的得分更加精确。
  4. dfs_query_then_fetch:相比query_then_fetch多包含一个额外阶段,在初始查询中执行分布式词频计算,返回的得分更加精确。
  5. count:只返回匹配的文档的数量,不返回文档
  6. scan:遍历查询,不计算得分。

搜索执行偏好

参数值 描述
_primary 只在主分片上执行搜索,不使用副本。
_primary_first 如果主分片可用,只在主分片上搜索,否则在其他分片执行
_local 只在发送请求的节点上的可用分片上执行搜索
_only_node:node_id 只在提供标示符的节点上搜索
_prefer_node:node_id Elasticsearch尝试在提供标示符的节点上搜索,否则,使用其他节点
_shards:1,2 在提供标示符的分片上执行,可以和其他首选项合并,但_shards必须在前。_shards:1,2;_local
自定义值 传入自定义的字符串

基本查询

  1. 词条查询(term)
  2. 多词条查询,通过mininum_match指定最小匹配的词条数量
  3. match_all查询
  4. query_string查询。支持全部的Apache Lucene查询语法
  5. 标示符查询。针对内部的_id字段
  6. more_like_this查询
  7. 最大分查询(dismax)。它非常有用,会生成一个由所有子查询返回的文档组成的并集。我们可以控制较低得分的子查询对文档最后得分的影响。最后得分是这样计算的:最高分数的子查询的得分之和,加上其余子查询的得分之和乘以tie参数的值,通过tie参数控制较低得分的查询对最后得分的影响
  8. 加权查询(boosting)。该查询封装了两个查询,有三个节点需要定义:positive部分包含所返回文档得分不会被改变;negative部分返回的文档得分将被降低;negative_boost部分包含降低negative部分查询得分的加权值
  9. constant_score查询。封装一个查询,被封装查询返回文档得分设置成一个常数

此外,elasticsearch还支持:前缀查询,模糊查询,通配符查询,正则查询

词条和多词条查询elasticsearch没有分析过程。

过滤器类型

  1. 范围过滤器
  2. exists过滤器
  3. missing过滤器
  4. 脚本过滤器
  5. 类型过滤器,指的是索引的类型
  6. 限定过滤器:限定单个分片返回的文档数目
  7. 标示符过滤器
  8. 命名过滤器。可以给过滤器指定名称,这样当过滤器很复杂时,就可以在查看返回结果中某一文档匹配了哪些过滤器

过滤器缓存:有些过滤器是默认缓存的,有些过滤器则不能缓存(即使打开也是无效的)。通过_cache参数设置

高亮

Lucene提供了三种类型的高亮实现:标准类型;FastVectorHighlighter,它需要词向量和位置才能工作;PostingsHighlighter,信息高亮器(字段定义中的index_options属性设为offsets),对单个词条的查询更智能,匹配句子结束边界。

Elasticsearch会自动选择正确的高亮实现方式,如果字段的配置中,term_vector属性设成了with_positings_offsets,则将使用FastVectorHighlighter。使用词向量将导致索引变大,但高亮执行时间更少,对于存储大量数据的字段来说,推荐使用FastVectorHighlighter

高亮的所有设置既可以在所有字段上设置,也可以针对某个字段单独设置(全局控制和局部控制)。

require_field_match控制高亮的字段只与查询时指定的字段对应,不会显示其他字段的符合条件的高亮信息。

控制高亮的片段

number_of_fragments:返回高亮片段的数量,默认是5。如果设置为0,整个字段将会返回,对于短字段可以这样设置。

fragment_size:高亮片段的最大字符长度,默认值是100

验证查询

ES查询时把请求发送到_search端点,有时候不知道DSL或定义语句是否正确时,将请求发送到_validate_query端点验证请求的正确性(有的错误请求无返回结果,这时无法判断是没有符合要求的数据还是请求错误)。

验证的命令如下

curl -XGET 'localhost:9200/index/_validate/query?pretty&explain' --data-binary @query.json

query.json是命令文件

数据排序

默认的排序是根据得分降序排序,可以通过{"sort":{"_sort":asc}}对结果升序排序

还可以指定字段进行排序,这个字段最好不要分析。

通过这查询中设置missing可以指定缺失字段在查询结果中的排列位置。

查询重写

任何涉及多词条的查询,如前缀查询或通配符查询,都会使用查询重写。它把原始的昂贵的查询修改成一组不太昂贵的查询。

Lucene内部的倒排索引机制记录了词条,对查询进行重写的时候,将条件匹配相关的词条,从而改写查询。

{
"query":{
"prefix":{
"title":"s",
"rewrite":"constant_score_boolean"
}
}
}

rewrite指定了重写的策略:

  • scoring_boolean:该选项将每个生成的词项转化为布尔查询中的一个或从句(Boolean should clause)。这种改写方法需要针对每个文档都计算得分。因此,这种方法比较耗费CPU,而且有些查询生成了太多的词项,以至于超出了布尔查询默认的1024个从句的限制。默认的布尔查询限制可以通过设置Elasticsearch.yml文件的index.query.bool.max_clause_count属性来修改。改写后的布尔查询的从句数越多,查询性能越低
  • constant_score_boolean:该选项与前面提到过的scoring_boolean类似,但是CPU耗费更少,这是因为并不计算每个从句的得分,而是每个从句得到一个与查询权重相同的一个常数得分,默认情况下等于1,我们也可以通过设置查询权重来改变这个默认值。与scoring_boolean类似,该选项也有布尔从句数的限制。
  • constant_score_filter(默认选项):在匹配的词项较少时,与constant_score_boolean类似,匹配的词项较多时,会遍历并查询所有的词项,然后使用相同的常数得分。文档数量较多时,好于上面两个。
  • top_terms_N:与scoring_boolean相似之处在于都会对从句计算得分,不同之处在于,该方法只保留最佳的N个词项,以避免触及布尔从句数的限制,并提升查询整体性能。
  • top_terms_boost_N:该选项与top_terms_N类似,不同之处在于它的文档得分不是通过计算得出的,而是被设置为跟查询权重(boost)一致,默认值为1。

需要性能更好,但忍受低精度选用topN,需要高精度,但忍受低性能选择constant_score_boolean

Elasticsearch--搜索的更多相关文章

  1. 一次 ElasticSearch 搜索优化

    一次 ElasticSearch 搜索优化 1. 环境 ES6.3.2,索引名称 user_v1,5个主分片,每个分片一个副本.分片基本都在11GB左右,GET _cat/shards/user 一共 ...

  2. ElasticSearch搜索介绍四

    ElasticSearch搜索 最基础的搜索: curl -XGET http://localhost:9200/_search 返回的结果为: { "took": 2, &quo ...

  3. Elasticsearch搜索结果返回不一致问题

    一.背景 这周在使用Elasticsearch搜索的时候遇到一个,对于同一个搜索请求,会出现top50返回结果和排序不一致的问题.那么为什么会出现这样的问题? 后来通过百度和google,发现这是因为 ...

  4. ElasticStack学习(六):ElasticSearch搜索初探

    一.ElasticSearch搜索介绍 1.ElasticSearch搜索方式主要分为以下两种: 1).URI Search:此种查询主要是使用Http的Get方法,在URL中使用查询参数进行查询: ...

  5. Elasticsearch搜索调优权威指南 (2/3)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/AAkVdzmkgdBisuQZldsnvg 英文原文:https://qbox.io/blog/el ...

  6. Elasticsearch搜索调优权威指南 (1/3)

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/qwkZKLb_ghmlwrqMkqlb7Q英文原文:https://qbox.io/blog/ela ...

  7. kotlin + springboot启用elasticsearch搜索

    参考自: http://how2j.cn/k/search-engine/search-engine-springboot/1791.html?p=78908 工具版本: elasticsearch ...

  8. Elasticsearch 搜索API

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  9. Elasticsearch 搜索数据

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  10. Elasticsearch搜索资料汇总

    Elasticsearch 简介 Elasticsearch(ES)是一个基于Lucene 构建的开源分布式搜索分析引擎,可以近实时的索引.检索数据.具备高可靠.易使用.社区活跃等特点,在全文检索.日 ...

随机推荐

  1. eclipse断点有个斜杠 skip all breakpoints

    切换到debug,单击下 skip all breakpoints 即可

  2. TensorFlow-GPU环境配置之二——CUDA环境配置

    1.安装最新显卡驱动 到系统设置->软件和更新->附加驱动中选中最新的显卡驱动,并应用 2.下载CUDA8.0 https://developer.nvidia.com/cuda-down ...

  3. Mybatis 最强大的动态sql <where>标签

    <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHER ...

  4. APPLE STORE

    直接在设置中,使用查看APPLE ID是无法更改的,现在必须要有所在区域的信用卡信息,支付方式无法像以前一样选择“无”. 查询后发现,有人说icloud3.0,即这个旧版的可以进行更改,于是下载. 但 ...

  5. shell脚本变量的参数

    https://stackoverflow.com/questions/5163144/what-are-the-special-dollar-sign-shell-variables mkdir f ...

  6. 【智能路由器】让MT7620固件openwrt支持USB

    [智能路由器]系列文章连接 http://blog.csdn.net/u012819339/article/category/5803489 首先确定硬件有USB,这个得检查板子是否引出了usb口,一 ...

  7. GMT和CST的转换

    GMT时间是格林尼治标准时间.CST时间是指包含中国.美国.巴西,澳大利亚四个时区的时间. 在javascript中默认CST是指美国中部时间,倘若在javascript中GMT转换CST则两者相差1 ...

  8. Junit 测试基础

    /** * 1.测试函数以     @Test  注解, 函数名可以根据测试内容自定义但返回值必须是void,不能有参数 * 2.assertEquals(arg0,arg1); 用来判断期待值是否和 ...

  9. go15---select

    package main import ( "fmt" ) //go语言提供了一个结构或者形式来帮助处理多个channel的发送和接收问题,这个结构叫做select, //sele ...

  10. 【Dairy】2016.10.20 生日记

    今天又有人生日耶(朱子鸿)~破壳快乐! 遥犇献歌一曲<就是现在>掌声!!!!!! 开森,呲到了草莓蛋糕,很好呲的.. 然后下去跑步,拿着奶油叉子,往卜卜脸上抹,可惜zks吸引不够(坑队友) ...