上海动易 网站,重庆网站优化建设,郑州外贸网站推广,wordpress 验证百度网盟#### 1.Elasticsearch是数据库#xff0c;不是普通的Java应用程序#xff0c;传统数据库需要的硬件资源同样需要#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库#xff0c;不是关系型数据库#xff0c;不具备严格的ACID事务特性#xff…#### 1.Elasticsearch是数据库不是普通的Java应用程序传统数据库需要的硬件资源同样需要提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库不是关系型数据库不具备严格的ACID事务特性任何企图直接替代严格事务性场景的应用项目都会失败!!!
##### 索引字段与属性都属于静态设置若后期变更历史数据需要重建索引才可生效 ##### 对历史数据无效 ##### 一定要重建索引 #### 全文文本概念 ### 概念介绍 ## 1.文章语句分词 ## 2.分词之后支持基于分词检索 ## 3.分词算法很多分词领域很深入 ## 4.基于倒排索引算法-Inverted-Index ## 5.分词检索的打分算法TF/IDFBM25 ## 6.字段类型仅限于text类型 ### Term 精确词项概念 # Term词项概念整个语句文字分为一个词 # 1.主要是keyword类型其余非text字段部分可用2.数据内容有长度限制(2的16次方字节) ## 词项精确查询介绍 # l.Term # 2.Terms # 3.Terms Lookup # 4.Terms set ## 是否需要分值计算 # query:分值计算 # filter:无需分值计算
# 准备数据DELETE kibana_sample_data_flights_term
POST _reindex
{source: {index: kibana_sample_data_flights},dest: {index: kibana_sample_data_flights_term}
}
# 查不出来因为Dest是text类型
GET kibana_sample_data_flights_term/_search
# 查不出来因为Dest是text类型
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {must: [{term: {Dest: {value: Venice Marco Polo Airport}}}]}}
}
# 使用Dest.keyword查出来既然是精确查询也可以不必用must使用filter
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {filter: [{term: {Dest.keyword: {value: Venice Marco Polo Airport}}}]}}
}
# 去掉一个Airport就查询不出来注意区分一整个词和分词的区别
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {filter: [{term: {Dest.keyword: {value: Venice Marco Polo}}}]}}
}
# Airport 改为小写的 airport 查询不出来使用keywod时候es不会做任何处理
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {filter: [{term: {Dest.keyword: {value: Venice Marco Polo airport}}}]}}
} # 使用term检索数值类型原则上非text类型都能用term检索 GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {filter: [{term: {FlightDelayMin: {value: 30}}}]}}
}
# 使用range效率没有term高es对数值类型有两套存储检索方式
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {filter: [{range: {FlightDelayMin: {gte: 20,lte: 36}}}]}}
} # case_insensitive, ASCII 是否区分大小写取值范围true/false默认false7.10.0版本之后增加
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{bool: {filter: [{term: {OriginCityName.keyword: {value: warsaw,case_insensitive: true}}}]}}
} ### terms查询
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {bool: {filter: [{terms: {OriginCityName.keyword: [Zurich,Warsaw]}}]}}
} ## terms lookup查询 # 基于指定某条数据的词项作为输入值生成词项查询条件 # 等同于应用中反向查询某个索引数据作为输入源 # 非常适用于比较同类型数据避免应用中二次查询 ## 查询参数 # terms查询关键字入口查询表达式入口 # index指定输入源索引 # id指定输入源 数据 id # path指定输入源字段路径特别要注意对象类型数据以及层次 # routing可指定输入源数据的路由标签
GET kibana_sample_data_ecommerce/_search
GET kibana_sample_data_ecommerce/_search
{track_total_hits: true,query: {terms: {sku: {index: kibana_sample_data_ecommerce,id: 9oTR0Y8BbWz2Sn6Eg4wZ,path: sku,routing:9oTR0Y8BbWz2Sn6Eg4wZ}}}
} ## terms_set # terms_set 也是多个输入值查询类似与 terms查询在属性条件上有更多的选择。 # 期望查询的字段的词数量与内容完全符合而不是只命中其中一个提供了一种字段数据与字段数据长度自主比较的能力。 ## 查询参数 # terms_set关键字查询表达式 # terms关键字输入查询内容的词数组 # minimum should match field关键字指定一个数值类字段要求输入的搜索内容必须与此值相等 # minimum should match script关键字通过脚本计算获取一个字段的长度数值 # boost关键字分值加权
GET kibana_sample_data_ecommerce/_search
# 重新准备新数据使用脚本增加一个manufacturer_count字段数据来源是manufacturer的长度
POST _reindex
{source: {index: kibana_sample_data_ecommerce},dest: {index: kibana_sample_data_ecommerce_term},script: {source: ctx._source.manufacturer_count ctx._source.manufacturer.length;}
} # terms 查询匹配数量与manufacturer_count一致的数据
GET kibana_sample_data_ecommerce_term/_mappings
GET kibana_sample_data_ecommerce_term/_search
# terms 查询匹配数量与manufacturer_count一致的数据
GET kibana_sample_data_ecommerce_term/_search
{track_total_hits: true,query: {terms_set: {manufacturer.keyword: {terms: [Elitelligence,Oceanavigations,Champion Arts,Pyramidustries],minimum_should_match_field: manufacturer_count}}}
} # terms 查询匹配数量与脚本返回一致的数据
GET kibana_sample_data_ecommerce_term/_search
{track_total_hits: true,query: {terms_set: {manufacturer.keyword: {terms: [Elitelligence,Oceanavigations,Champion Arts,Pyramidustries],minimum_should_match_script: {source:doc[manufacturer.keyword].length;}}}}
} ## Fuzzy 容错查询非高效率查询 # 有很多应用场景我们对于输入的内容并无严格的校验导致入库的内容有错别字此时需要一定的纠错查询ES 针对此需求设计了糊纠错查询。 # fuzzy 查询是一种非常消耗 CPU 资源的查询方式主要要海量的计算应该尽量避免或者缩短差值 ## 查询参数 # fuzzy关键字查询表达式 # value关键字查询输入的内容单词本质应该输入一个错误的词项 # fuzziness关键字容错的字符数量建议设置为严格的数字取值范围数字或者“AUTO” # max_expansions关键字计算的容错词项数量默认50尽量控制这个数量 组建议设置更低性能影响巨大 # prefix_length关键字控制容错词的起始位置从左开始设置的值应该小于 value 的字符长度建议设置的更加精确性能更好 # transpositions关键字控制字符前后位置对调来纠错查询取值范围 true/false默认 true # boost关键字分值加权 # rewrite重写查询表达式此值目前不过渡深入属于资深人员学习掌握
GET kibana_sample_data_flights_term/_search
# 查询 Washington, 故意把最后一个字母写错Washingtom可以查出来
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {bool: {must: [{fuzzy: {DestCityName.keyword: {value: Washingtom}}}]}}
} # 查询 错误的 Washington, Washingtomm 并设置fuzziness数量为1查不出来改为2就可以查出来了
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {bool: {must: [{fuzzy: {DestCityName.keyword: {value: Washingtomm,fuzziness:1}}}]}}
}
## prefix 前缀查询类说mysql 的like语句 # 基于词项的前缀内容自动匹配后面的内容只要符合就全部查询出来 ## 查询参数 # prefix关键字查询表达式 # value关键字输入的前缀字符内容 # rewrite重写参数 # case_insensitive大小写敏感
# 查询Washington的前缀
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {bool: {must: [{prefix: {DestCityName.keyword: {value: Washing}}}]}}
}
## wildcard通配符查询基于通配符*模糊查询 # ES7.9版本推出了 wildcard 字段类型基于 ngram 算法检索效率相比*的查询要高 ## 查询参数 # wildcard关键字查询表达式 # value关键字查询输入内容内容可以采用通配符方式 # boosts关键字分值加权 # rewrite重写表达式 # case_insensitive大小写敏感
# 在这个索引中DestCityName是text类型使用通配时要定义成wildcard类型最好
GET kibana_sample_data_flights_term/_mappings
# 通配查询Washington
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {wildcard: {DestCityName.keyword: {value: *ashington}}}
}
## exist 逻辑查询 # ES 字段是可以动态扩展的常规下无任何限制导致在数据查询时会造成部分数据字段缺失从而查询错误此判断可以有效过滤筛选此类数据
GET kibana_sample_data_ecommerce,kibana_sample_data_ecommerce_term/_search
{track_total_hits:true,query:{exists: {field: manufacturer_count}}
}
## ids查询本质上等同于MGET
GET kibana_sample_data_ecommerce_term/_doc/9oTR0Y8BbWz2Sn6Eg4wZ
GET kibana_sample_data_ecommerce_term/_search
{query:{ids: {values: [9oTR0Y8BbWz2Sn6Eg4wZ,94TR0Y8BbWz2Sn6Eg4wZ]}}
}
// 有限制字符串长度默认512字节
GET kibana_sample_data_ecommerce_term/_search
{query:{terms: {_id: [9oTR0Y8BbWz2Sn6Eg4wZ,94TR0Y8BbWz2Sn6Eg4wZ]}}
}
## range 数值范围查询 # 查询参数 # range关键字查询表达式 # gte关键字范围值 # # # gt关键字范围值 # # lte关键字范围值 # lt关键字范围值 # boost关键字分值加权 # relation关键字范围查询关系针对xxx_range 范围字段才有效
# 数值范围查询
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{range: {FlightDelayMin:{gte: 10,lte: 20,boost: 1}}}
}
## 时间范围查询 # date时间是一种特殊的数值类型还必须考虑到时区所以建议任何时候都必须使用UTC格式否则容易出现问题 # range关键字查询表达式 # time zone关键字时区表达式增加时区或者减少时区 # 查询某个时间范围类的航班信息时间范围支持固定时间也支持动态计算类型
# 查询固定时间
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{range: {timestamp:{time_zone: 00:00, gte:2024-03-20T12:09:35,lte: 2024-07-20T12:09:35,boost: 2}}}
}
# 查询动态时间
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{range: {timestamp:{time_zone: 00:00, gte:now-200d/d,lte: now,boost: 2}}}
}
## ragexp 正则表达式查询慎用或者禁用容易出现性能问题有通配符的已经足够了 # 查询参数 # regexp关键字查询表达式 # values关键字输入内容包括查询表达式
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query:{regexp: {DestCityName.keyword:{value: Man.*}}}
}
## 词项限制 # terms查询字段数量限制超过查询会报错一般也不会超过 # 此设置属于动态设置可临时修改 # 字段数量限制默认 65535index.max terms count:65536 ### span 跨度查询全文本查询使用高级查询非必须掌握 # span跨度查询基于分词词项的精确位置控制问隔设定相似度来执行相比match 匹配类查询提供了更加底层灵活的查询机制同时也是非常复杂。 # span也提供了多种跨度查询方式
# 默认分词会转成小写
POST _analyze
{text:[Hello David so Cool]
}
## span_term # span term 等同与 term 查询区别在于前者是应用在 text类型中后者是在 keyword 类型 # span term 单独查询仅仅是为了展示目的是为了后续的关系查询准备 # 查询参数 # span term关键字查询表达式 # value关键字输入值注意默认standard分词下此处采用统一会转化成小写 # boost关键字分值加权
# 大写开头查不出来注意大小写
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {span_term: {Origin: {value: edmonton}}}
}
## span_first # span_first跨度第一个词搜索词项位置属于靠前从左往右 # 查询参数 # span_first关键字查询表达式 # span_term关键字指定其中跨度搜索的字段 # end关键字控制搜索词项内容的距离最大位置
# 搜索目的地机场名字中包含“international”且从第1个位置不超过2个词;修改查询条件对比前后查询的结果与数据量。
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {span_first: {match: {span_term: {Dest: international}},end: 2}}
}
## span near # span_near跨度相近位置查询 # 查询参数 # span_near关键字查询表达式 # clauses关键字组合多个跨度查询 # slop多个跨度条件直接的间隔 # in_order多个跨度查询是否按照顺序进行取值范围true/false
# 搜索目的机场包含“charlotte”与“international“且中间间隔不超过1个词项必须按照顺序
GET kibana_sample_data_flights_term/_search
{query: {span_near: {clauses: [{span_term: {Dest: {value: vienna}}},{span_term: {Dest: {value: international}}}],slop: 1,in_order: true}}
}
## span_or # span_or多个跨度词项组合关系是 or只要其中任意的满足查询即可 # 查询参数 # span_or关键字 # clauses关键字查询表达式组成多个跨度查询 # span_term关键字跨度查询必须所有的跨度查询字段指向一致
GET kibana_sample_data_flights_term/_search
{query: {span_or: {clauses: [{span_term: {Dest: {value: airport}}},{span_term: {Dest: {value: international}}},{span_term: {Dest: {value: pisa}}}]}}
}
## span not # span_not组合多个跨度查询包含其中跨度不包含其中部分跨度 # 查询参数 # span_not关键字 # include关键字包含 # exclude关键字不包含
# 查询目的地机场词项包含“internationa!”不包含“Spokane”的航班信息
GET kibana_sample_data_flights_term/_search
{query: {span_not: {include: {span_term: {Dest: {value: international}}},exclude: {span_term: {Dest: {value: spokane}}}}}
}
## span_multi # span_multi组合多种查询方式, # 查询参数 # span_multi关键字查询表达式 # match关键字查询表达式prefix、term、range、wildcardfuzzy参考 term 领域的查询方式
# 搜索目的地机场词项前缀包括”edmonton“的航班信息
GET kibana_sample_data_flights_term/_search
{query: {span_multi: {match: {prefix: {Dest: {value: edmonton}}}}}
}
## span_containing # span containing组合多种跨度查询;little 优先big次之 # 组合多个条件检索仅仅返回 little 部分数据
## span_within # span within组合多种跨度查询;big优先little次之 # 组合多个条件检索仅仅返回 big 部分数据
## field_masking_span # field_maskingspan组合多种跨度查询带有一点伪装的特性。 # 跨越多个字段组合查询 ## Specialized 特殊查询 # script # script脚本是一种非常灵活的查询方式同时背后也是有性能代价的若脚本查询的字段需要更多的操作计算建议可以采用runtime字段方式 # 查询参数 # script脚本查询表达式入口 # source脚本内容必须符合 bool类型;脚本采用painless # params输入值参数
# 查询电商信息数据依据星期数过滤返回结果
GET kibana_sample_data_ecommerce/_search
{track_total_hits: true,query: {bool: {filter: [{script: {script: {source: doc[day_of_week_i].value1;,params: {day_of_week_i:1}}}}]}}
}
## script score # 文本字符查询ES 默认采用 BM25 计算分值排序若要需要基于自定义字段分值可采用script_score # 同比类同 function_score 一样 # 也支持很多高级函数 # 查询参数 # script score脚本分值查询关键字查询表达式入口 # query查询表达式 # script脚本计算自定义分值计算 # boost加权值 # min_score最低分值限制
# 基于航班数据搜索目的包含“warsaw”,排序基于2个时间相加
GET kibana_sample_data_flights_term/_search
{track_total_hits: true,query: {script_score: {query: {match: {Dest: warsaw}},script: {source: doc[FlightDelayMin].valuedoc[FlightTimeMin].value;}}}
}
## pinned 文档“固定”到搜索结果的顶部 # 对于实现个性化推荐、广告展示或确保某些重要文档始终出现在搜索结果的前面非常有用 # ids这是一个数组包含你希望固定的文档的 _id 或其他唯一标识符。这些文档将被固定到搜索结果的顶部。 # field指定用于匹配文档的字段默认是 _id。如果你使用的是自定义的唯一标识符字段可以在这里指定。 # exclude布尔值表示是否从最终的搜索结果中排除固定的文档。默认值为 false即固定的文档仍然会出现在搜索结果中。如果设置为 true则固定的文档不会出现在最终结果中但它们的排名信息仍然会被保留。 # inner_hits可选参数用于配置返回的固定文档的详细信息。你可以使用 inner_hits 来控制返回的固定文档的数量、排序方式、高亮显示等。 # rest这是用于查询其他非固定文档的查询条件。你可以在这里使用任何标准的 Elasticsearch 查询 DSL例如 match、term、bool 等。
GET kibana_sample_data_ecommerce/_search
{query: {pinned: {ids: [VITR0Y8BbWz2Sn6Eg40a, U4TR0Y8BbWz2Sn6Eg40a], organic: { match: {products.product_name: top}}}}
} ### 查询建议 # Term查询应该大规模使用属于精确查询 # span慎重应用了解底层机制优先 # 词项查询 # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/term-level-queries.html # 跨度查询 # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/span-queries.html # 特殊查询 # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/specialized-queries.html # script-score 脚本分值 # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/query-dsl-script-score-guery.htm # index-max-terms-count # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/index-modules.html#index-max-terms-count # fuzziness 取值范围 # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/common-options.html#fuzziness # fuzzy 计算算法 # https://en.wikipedia.org/wiki/Levenshtein_distance # rewrite 重写参数 # https://www.elastic.co/guide/en/elasticsearch/reference/8.6/query-dsl-multi-term-rewrite.html # date-math 时间计算 # https:/www.elastic.co/guide/en/elasticsearch/reference/8.6/common-options.html#date-math
# “固定”到搜索结果的顶部
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/query-dsl-pinned-query.html