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缓存