ES queryDSL

1、copy_to

PUT my_index
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "text"
      }
    }
  }
}

2、深分页

2.1 from+to 

最大分页条数10000条, 通过修改 max_result_window  调整最大值。

官方建议:
避免过度使用 from 和 size 来分页或一次请求太多结果。

不推荐使用 from + size 做深度分页查询的核心原因:

搜索请求通常跨越多个分片,每个分片必须将其请求的命中内容以及任何先前页面的命中内容加载到内存中。
对于翻页较深的页面或大量结果,这些操作会显著增加内存和 CPU 使用率,从而导致性能下降或节点故障。

2.2 Search After (深分页)

2.3 scroll 滚动查询 (数据导出)

详见 https://www.cnblogs.com/tenic/p/16795909.html

3、minimum_should_match

        如果查询条件中有should,则必须至少满足 minimum_should_match 个数的条件

GET goods/_search
{
  "from": 0, 
  "size": 1000,
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase": {
          "type": "red"
          }
        }
      ],
      "should": [
        {
          "terms": {
            "province": [
              "广西",
              "广东"
            ]
          }
        },
        {
          "terms": {
            "city": [
              "钦州市",
              "中山市"
            ]
          }
        }
      ],
     "minimum_should_match":1
    }
  }
}

当minimum_should_match=1时,则查询到的结果是type=red,province in(广西,广东)或type=red,city in(钦州市,中山市);

当minimum_should_match=2时,则查询到的结果是type=red,province in(广西,广东)同时也要city in(钦州市,中山市);

如果没有设置minimum_should_match或者minimum_should_match=0,则查询到的结果是type=red而已,should条件里没有起效果。

4、match_phrase和slop

        两个词是否相邻,必须相邻才能返回。

精确短语(Exact-phrase)匹配也许太过于严格了。也许我们希望含有"quick brown fox"的文档也能够匹配"quick fox"查询,即使位置并不是完全相等的。移动一个词条多少次来让查询和文档匹配。

GET /my_index/my_type/_search
{
    "query": {
        "match_phrase": {
            "title": {
                "query": "quick fox",
                "slop":  1
            }
        }
    }
}

5、simple query string

详见: simple_query_string查询_Lq_joe的博客-CSDN博客 

6、fuzziness

模糊搜索(搜索中允许有几个错别字?)

GET /book/novel/_search
{
  "query": {
    "fuzzy": {
      "name": {
        "value": "心像印,是这一招纸巾",
        "fuzziness": 2     #偏差的个数,

        "prefix_length": 1 #指定前面几个字符是不允许出现错误的
      }
    }
  }
}

7、bosting

boosting查询可以帮助我们去影响查询后的score。也就是分数;
~positive(积极的,加分):只有匹配上positive的查询的内容,才会被放到返回的结果集中。
~negative(消极的,减分):如果匹配上positive并且也匹配上negative,降低这样的文档score。
~negative_boost:指定系数,必须小于1.0 ,那么匹配到的内容会将分数乘以当前系数;(这是个系数,因为你要控制分数,那要怎么控制呢?就是乘以系数来控制分数大小)

#term查询
GET /book/novel/_search
{
  "query": {
    "boosting": {
      "positive": { 
        "term": {
          "desc": {
            "value": "好"
          }
        }
      },
      "negative": { 
        "term": {
          "desc": {
            "value": "三"
          }
        }
      },
      "negative_boost": 0.5
    }
  }
}

8、dis_max 

相当于mysql的max

{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

评分低的字段虽然不能和评分高的字段一样的权重,但是也不能完全没有权重。tie_breaker可以给评分较低的字段一个权重。 

POST blogs/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Quick pets" }},
                { "match": { "body":  "Quick pets" }}
            ],
            "tie_breaker": 0.2
        }
    }
}

 0 根据最佳匹配结果 1 根据算分结果; 0-1的值乘以权重

9、 multi_match 查询

三种类型:  best_fields (默认)、most_fields 和 cross_fields(最佳字段、多数字段、跨字段)

9.1 best_fields 

        默认情况下,查询的类型是 best_fields ,当字段之间相互竞争,又相互关联。例如 title 和 content 这样的字段,评分来自最匹配字段

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": ["title", "content"],
      "type": "best_fields",
      "tie_breaker": 0.3,
      "minimum_should_match": "30%"
     }
  }
}

        完全匹配"java""学习"的文档评分会比较靠前,如果只匹配“java”的文档评分乘以0.3的系数。我们希望完全匹配的文档占的评分比较高,则需要使用best_fields。 

9.2 Most Fields模式

我们希望越多字段匹配的文档评分越高,就要使用most_fields

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": ["title", "content"],
      "type": "most_fields"
     }
  }
}

 most_fields,综合多个field一起进行搜索,尽可能多地让所有field的query参与到总分数的计算中来

9.3  Cross Field模式

我们会希望这个词条的分词词汇是分配到不同字段中的,那么就使用cross_fields

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query" : "java学习",
      "fields": ["title", "content"],
      "type": "cross_fields"
     }
  }
}

cross-fields搜索,一个唯一标识,跨了多个field。比如一个人,标识,是姓名;一个建筑,它的标识是地址。姓名可以散落在多个field中,比如first_name和last_name中,地址可以散落在country,province,city中。跨多个field搜索一个标识,比如搜索一个人名,或者一个地址,就是cross-fields搜索初步来说,如果要实现,可能用most_fields比较合适。 

 参考:ElasticSearch(es) multi_match查询

10、聚合操作

10.1 聚合操作分类

        聚合操作分三大类metric agg、buckect agg、pipeline agg

ES详解 - 聚合:聚合查询之Bucket聚合详解 | Java学习笔记

10.2 聚合查询不精确

数据量,精确度,实时性 只能满足2个

10.3 优化

 设置主分片是1
方案2: 调大 shard size 值设置 shard size 为比较大的方推 : s9gYd size 值越大,结果越趋近于精准聚合结果值。此外,还可以通过show term doc count error参数显示最差情况下的错误值,用于辅助确定 shard size 大小。
size: 是聚合结果的返回值,客户期望返回聚合排名前三,size值就是 3。shard size: 每个分片上聚合的数据条数。shard size 原则上要大于等于 size适用场景: 数据量大、分片数多的集群业务。

{
    "aggs":
    {
        "ip_agg":
        {
            "terms":
            {
                "field": "ip",
                "size": 10,
                "shard_size": 10000,
                "order":
                {
                    "_count": "desc"
                }
            }
        }
    }
}

时间缓存 now-1h
now/m
拆分昵称msearch
插入是索引文档排序
fielter缓存

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值