es 3期 第16节-运用启发式特性引导用户查询
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
#### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!
##### 索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
##### 对历史数据无效!!!!
##### 一定要重建索引!!!!
### suggester启发式查询应用
# 基于text字段哦
# 依据用户输入关键字,引导用户输入完整的搜索词;用户在首次搜索时,也无法知晓已有搜索引擎中存在哪些有效的关键字可以搜索
# 应用行业:电商领域、知识图谱等
## 启发式查询本质
# 查询本质全文检索时检索文档内容本身;启发式检索时检索文档分词词项本身;
## 启发式背后原理
# ES对于文本词项,会进行分词,将分词相关信息存储起来,有分词的位置信息,分词的各种红统计信息等。启发式搜索基于倒排索引,仅仅去搜索词项即可,无需搜索词项之后的文档,搜索词项依据词项之间的距离。
# 注意,在启发式搜索中,单个词项必须是非完整的
## 启发式查询分类
# 启发式查询分类
# term:单个词项
# pharse:短语
# completion:自动完成
# context:上下文
## Term suggester
# 概念解释
# 基于单个分词进行启发式搜索,全部能力等同term搜索
GET kibana_sample_data_logs/_search
# 分析logs索引message字段text文本分词结果
POST _analyze
{
"text":[
"223.87.60.27 - - [2018-07-22T00:39:02.912Z] \"GET /elasticsearch/elasticsearch-6.3.2.deb_1 HTTP/1.1\" 200 6219 \"-\" \"Mozilla/5.0 (X11; Linux x86_64; rv:6.0a1) Gecko/20110421 Firefox/6.0a1\""
]
}
# 这里搜索linux是查文本内容
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"query":{
"match": {
"message": "linux"
}
}
}
# 搜索linux,故意缺少最后一个字母x
# 这里搜索linu是查倒排索引
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"linu",
"term":{
"field":"message"
}
}
}
}
# 查询词项多个查询
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"linu kiban window",
"term":{
"field":"message"
}
}
}
}
# 查询多个词项查询
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"linu",
"term":{
"field":"message"
}
},
"agent_suggest":{
"text":"windo",
"term":{
"field":"agent"
}
}
}
}
# request 参数
# 常用参数
# text,关键字,输入的启发式词项,注意,词项不可完整,否则无法展现
# field,关键字,指定搜索的字段,注意,必须是 text类型
# analyzer,关键字,输入内容指定不同的分词器,建议与 text类型一致
# size,关键字,限制返回待选择的词项数量,默认不限制
# sort,关键字,启发式搜索结果排序,支持score=分值,frequency=词频,默认分值
# suggest_mode,关键字,启发式词项筛选,范围取值 mission=未索引的词项,popular=热度高的词项,always=符合条件的词项,默认popular
# sort 参数解读
# suggest_mode 参数解读
# 参数 说明
# missing 未索引的词项
# popular 热度高的词项
# always 符合条件的词项
# 查询参数使用
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"linu",
"term":{
"field":"message",
// 全部有5个,限制只返回3个
"size":3,
// 设置根据词频排序,默认根据分值排序
"sort":"frequency",
// 这个可以不掌握,比较难懂,涉及到很多算法,需要深入学习
"suggest_mode":"popular"
}
}
}
}
# 高级参数
# shard_size,关键字,多分片查询时,需要限制分片返回的词项数量,建议值大于 size 即可,size是取最终结果的返回数量,注意与这个区分开
# max_edits,关键字,控制字符容错数量的,默认全部支持,类同fuzz词项搜索,根据需求设置长度;取值范围1~2,默认 2
# prefix_length,关键字,控制输入内容的前缀长度,默认1,可有效减少计算量
# min_word_length,关键字,它确保只有长度大于或等于指定值的单词会被用于生成建议
# max_inspections,关键字,分片词项数量shard_size 的倍数,默认5
# min_doc_freg,关键字,现在返回词项,词项必须满足文档匹配最低的数量,默认 0=没有限制, es 7.0后废弃了
# max_term_freg,关键字,词项出现的频率, es 7.0后废弃了
# string_distance,关键字,词项字符计算距离的方式,支持多种高级的数学算法,建议专业性去看此方面论文,默认internal,其他值 damerau_levenshtein, levenshtein, jaro_winkler, ngram
# 查询参数使用
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"Mozil",
"term":{
"field":"message",
// 全部有5个,限制只返回3个
"size":3,
"shard_size":4,
// 每个分片允许返回的数量
"max_inspections":5,
"min_word_length":4,
"prefix_length":1
}
}
}
}
## Phrase suggester
# 短语启发式搜索,功能类同 mathc phrase,基多个词进行搜索,且可以控制词项之间的步长
# 启发式搜索中,输入的分词内容,必须是不完整的单词,若完整则无法计算与其它相似词的距离,也就无法返回搜索的结果。
# 内部算法基于 ngram-language 语法模型实现
## 查询参数
# 关键字,启发搜索查询表达式suggest,
# phrase,关键字,指定短语搜索的字段
# highlight,关键字,匹配的关键字高亮,用于标记内容
# size,关键字,控制返回的短语数量
# analyzer,关键字,设置分词器
# shard_size,关键字,分片返回的短语选项,默认大于size 值
# gram_size,关键字,NGram 模型,自然语言处理 NLP 领域,详细的去查阅相关论文(非分词领域勿过度深入)默认 1
# real_word_error_likelihood,关键字,控制字符串拼错率,取值 0~1,默认 0.95,容许 0.05 容错;反过来,就是字符串的相似度
# confidence,关键字,置信度,控制返回结果的数据量,取值 0~1,默认1,有命中的就返回,无命中的不返回
# max_errors,关键字,最大错误短语数量,默认 1,控制匹配到的返回短语错误数据量,调整值,会增加返回的数据。
# separator,关键字,NGram 语言模型的分隔符,默认基于空格,详细的可以去查阅相关论(文非分词领域勿过度深入)
# collate,关键字,收缩模型,短语搜索收缩,涉及到搜索内部执行过程,此处不深入展开;取值范围 true/false,默认 false
# smoothing 关键字,语言模型参数,smoothing_models=stupid_backoff,laplace,linear_interpolation
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"query":{
"match": {
"message": "plugins wordpress"
}
}
}
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"plugi wordpre",
"phrase":{
"field":"message",
"highlight":{
"pre_tag": "<h1>",
"post_tag": "</h1>"
}
}
}
}
}
## direct_generator 高级参数
# 以下很多参数,需要对于分词领域有深入了解,才可以深入,否则不建议过度深入。
# direct_generator,关键字,候选短语生成的方向,往前或者往后
# max_edits,关键字,控制字符容错数量的,默认全部支持,类同fuzzy词项搜索,根据需求设置长度
# prefix_length,关键字,控制输入内容的前缀长度,默认1,可有效减少计算量
# min_word_length,关键字,控制筛选后的词项最低长度,默认是4,最小值可以设置1
# shard_size,关键字,多分片查询时,需要限制分片返回的词项数量,建议值大干 size 即可
# max_inspections,关键字,分片词项数量shard size 的倍数,默认5
# min_doc_freg,关键字,现在返回词项,词项必须满足文档匹配最低的数量,默认 0=没有限制
# pre_filter,关键字,前置分词器(后面分词器专讲)
# post_filter,关键词,前置分词器(后面分词器专讲)
# suggest_mode,关键字,参考前面term,默认missing
# suggest_mode, 参数解读
# 参数 说明
# missing 未索引的词项
# popular 热度高的词项
# always 符合条件的词项
GET kibana_sample_data_logs/_search
{
"track_total_hits":true,
"suggest":{
// 这里可以自定义取字段名
"message_suggest":{
"text":"plugi wordpre",
"phrase":{
"field":"message",
"highlight":{
"pre_tag": "<h1>",
"post_tag": "</h1>"
},
"direct_generator":[
{
"field":"message",
"size":10,
"suggest_mode":"always",
"max_edits":2,
"prefix_length":1,
"min_word_length":4,
"max_inspections":5,
"min_doc_freq":1,
"pre_filter":"simple",
"post_filter":"simple"
}
]
}
}
}
}
## Completion suggester
# 始数据结构化,并发基于倒排索引,而是基于FST,便于提升搜自动补全,基于 completion 数据字段类型,将度索效率,可快速响应。
# 与前面 term/phase 差异也在与搜索内容的完整性,必须输入词项的完整性,不能有错误的词项拼写
# 先创建索引
# 自动补全机制,其底层依赖数据结构与普通索引不一样,必须提前设置好字段类型以及字段属性
# type,字段类型,必须为:completion
# analyzer,分词器,默认为:simple,注意分词器不同,自动补全的效果不一致
# search analyzer,查询分词器,默认与analyzer一致
# preserve_separators,默认 true,是否容许分隔符,不容许的话,多个词项之间会出现连接
# preserve_position_increments,默认 true,是否去除停用词(分词领域)
# max_input length,默认 50,限制匹配字符的长度,设置上限,防止性能过多膨胀
DELETE kibana_sample_data_flights_completion
PUT kibana_sample_data_flights_completion
{
"mappings":{
"properties":{
"Dest_completion":{
"type":"completion",
"analyzer":"simple",
"search_analyzer":"simple",
"preserve_separators": true,
"preserve_position_increments":true,
"max_input_length":50
},
"Origin_completion":{
"type":"completion"
}
}
}
}
GET kibana_sample_data_flights_completion/_mappings
POST _reindex
{
"source": {
"index": "kibana_sample_data_flights"
},
"dest": {
"index": "kibana_sample_data_flights_completion"
},
"script": {
"source": """
ctx._source.Dest_completion=ctx._source.Dest;
ctx._source.Origin_completion=ctx._source.Origin;
"""
}
}
# 查询常用
# suggest,查询表达式
# prefix,查询表达式,:输入查询内容,基于前缀匹配模式
# text,查询表达式,输入查询内容,必须全部匹配完整的
# completion,查询表达式,选择自动补全查询模式
# field,指定自动补全字段
# size,控制返回数据的条数,默认5
# skip_duplicates,是否跳过重复的数据,取值范围 true/false,默认 false
# fuzzy,是否启用纠错性匹配查询,参数设置类同 term-fuzzy 查询模块
# 全匹配搜索
GET kibana_sample_data_flights_completion/_search
{
"suggest":{
"Dest_completion":{
"text":"Edmonton International Airport",
"completion":{
"field":"Dest_completion",
// 控制返回的数量
"size": 2,
// 跳过重复的数据
"skip_duplicates":true,
"fuzzy": {
"fuzziness":1,
"transpositions": true,
"min_length": 3,
"prefix_length": 1,
"unicode_aware": true
}
}
}
}
}
# 前缀搜索
GET kibana_sample_data_flights_completion/_search
{
"suggest":{
"Dest_completion":{
"prefix":"Edmont",
"completion":{
"field":"Dest_completion"
}
}
}
}
# Edmonton International Airport 跳过中间的单词International搜索,查不出来
GET kibana_sample_data_flights_completion/_search
{
"suggest":{
"Dest_completion":{
"text":"Edmonton Airport",
"completion":{
"field":"Dest_completion"
}
}
}
}
# regex,正则查询表达式,输入查询内容(建议少用或者不用)
GET kibana_sample_data_flights_completion/_search
{
"suggest":{
"Dest_completion":{
"regex":"edmon.*",
"completion":{
"field":"Dest_completion"
}
}
}
}
# 数据填充
# 补全类型,支持2中不同的数据填充方式,一种默认纯文本,一种设定权重。
# input,输入内容
# weight,内容权重,影响搜索结果分值,影响排序
POST kibana_sample_data_flights_completion/_doc
{
"Dest_completion": [
"Edmonton International Airport",
"Charles de Gaulle International Airport"
]
}
## Context suggester
# 自动补全机制依据关键字可以很快速的查询想要的词建议,但很多时候,希望可以依据内容的其它字段做一些上下文的限制
# 其中字段类型 completion上下文启发式查询,依然需要基于自动补全机制
# 如果非必要分词领域深入,可以忽略
# 关键参数
# completion,关键字,自动补全,设定 mapping字段类型;搜索检索查询表达式入口
# contexts,关键字,上下文,设定mapping上下文,用于后续限制上下文搜索
# 创建mapping复制数据
DELETE kibana_sample_data_flights_context
PUT kibana_sample_data_flights_context
{
"mappings": {
"properties": {
"DestSug": {
"type": "completion",
"contexts": [
{
"name": "DestWeather",
"type": "category"
}
]
}
}
}
}
#数据 1
POST kibana_sample_data_flights_context/_doc
{
"DestSug": {
"input": [
"Manchester Airport"
],
"contexts": {
"DestWeather": [
"Rain",
"Clear"
]
}
}
}
#数据 2
POST kibana_sample_data_flights_context/_doc
{
"DestSug": {
"input": [
"Manchester Airport"
],
"contexts": {
"DestWeather": [
"Damamging",
"Hail"
]
}
}
}
GET kibana_sample_data_flights_context/_search
GET kibana_sample_data_flights_context/_search
{
"suggest":{
"DestSug":{
"prefix":"Mancheste",
"completion":{
"field":"DestSug",
"size":10,
"contexts":{
"DestWeather":["Hail"]
}
}
}
}
}
## 上下文限制类型有 2种,一种基于文本类目,一种基于 geo 地理位置坐标。
# completion,自动补全字段类型
# contexts,字段上下文关系设置
# type=category,上下文关系为 类目方式
# type=geo,上下文关系为,地理位置关系(此处不再深入)
# path,指向字段,可以不设置,如果这样的,需要在填充数据时,设置指定
# type参数解读
# 类型值 说明
# category 基于类目方式限制
# geo 基于 gps 位置限制,此处不过渡探讨,属于专业领域
DELETE kibana_sample_data_flights_context
PUT kibana_sample_data_flights_context
{
"mappings": {
"properties": {
"DestSug": {
"type": "completion",
"contexts": [
{
"name": "DestWeather",
"type": "category",
"path": "DestWeather"
}
]
},
"OriginSug": {
"type": "completion",
"contexts": [
{
"name": "OriginWeather",
"type": "category",
"path": "OriginWeather"
}
]
}
}
}
}
# 数据填充
# 上下文限制,数据填充方式依据 Mapping 规则,方式不一
# input,数据填充参数,依据 mapping 设置选择是否必须
# contexts,数据填充参数,依据 mapping 设置选择是否必须
#数据 1,未设置path字段,必须指明数据参数
POST kibana_sample_data_flights_context/_doc
{
"DestSug": {
"input": [
"Manchester Airport"
],
"contexts": {
"DestWeather": [
"Rain",
"Clear"
]
}
}
}
#数据 2,设置了path字段指向,必须填充path字段内容
POST kibana_sample_data_flights_context/_doc
{
"DestSug": [
"Manchester Airport"
],
"DestWeather": [
"Damamging",
"Hail"
]
}
GET kibana_sample_data_flights_context/_search
## Request 请求参数
# 查询常用
# suggest,查询表达式
# prefix,查询如数文本内容
# completion,查询类型,自动补全类型
# field,指定查询的字段
# size,限制返回的数据量
# contexts,指定上下文的字段与内容
# boost,调整上下文限制的优先级
# prefix,限制上下文内容的前缀,范围 true/false
# 重建索引,设置 mapping 上下文指向
# 执行检索,比对不同的结果
DELETE kibana_sample_data_flights_context
PUT kibana_sample_data_flights_context
{
"mappings": {
"properties": {
"DestSug": {
"type": "completion",
"contexts": [
{
"name": "DestWeather",
"type": "category",
"path": "DestWeather"
}
]
},
"OriginSug": {
"type": "completion",
"contexts": [
{
"name": "OriginWeather",
"type": "category",
"path": "OriginWeather"
}
]
}
}
}
}
# 数据复制,索引重建
POST _reindex
{
"source": {
"index": "kibana_sample_data_flights"
},
"dest": {
"index": "kibana_sample_data_flights_context"
},
"script": {
"source": """
ctx._source.DestSug=ctx._source.Dest;
ctx._source.OriginSug=ctx._source.Origin;
"""
}
}
GET kibana_sample_data_flights_context/_search
# 查询1
GET kibana_sample_data_flights_context/_search
{
"suggest":{
"DestSug":{
"prefix":"Mancheste",
"completion":{
"field":"DestSug",
"size":10,
"contexts":{
"DestWeather":["Hail"]
}
}
}
}
}
# 查询2
GET kibana_sample_data_flights_context/_search
{
"suggest": {
"DestSug": {
"prefix": "Mancheste",
"completion": {
"field": "DestSug",
"size": 10,
"contexts": {
"DestWeather": [
{
"context": "Hail",
"prefix": true,
"boost": 1
},
{
"context": "Clear",
"boost": 10
}
]
}
}
}
}
}
## 启发式查询类型
# 有一些场景需求,需要知晓查询启发式检索类型
# 查询参数
# typed_keys,关键字,用于输出启发式搜索类型
GET kibana_sample_data_logs/_search?typed_keys
{
"suggest": {
"message_sug": {
"text": "plugi wordpres",
"phrase": {
"field": "message",
"size": 10,
"highlight":{
"pre_tag": "<h1>",
"post_tag": "</h1>"
}
}
}
}
}
## termvectors
# 借助分词能力,帮助分析统计索引词向量
# 包括词项出现的文档数量,出现的次数,词项出现的文章
# 查询参数
# termvectors,查询API
# 指定数据 ID
# fields,指定字段
# 查询1
GET kibana_sample_data_logs/_termvectors/roTR0Y8BbWz2Sn6EiJjA?fields=agent
# 查询2
GET kibana_sample_data_logs/_termvectors/roTR0Y8BbWz2Sn6EiJjA
{
"fields": [
"agent"
],
"offsets": true,
"payloads": true,
"positions": true,
"term_statistics": true,
"field_statistics": true
}
# Request 请求参数
# Url 参数
# fields,指定词向量统计分析的字段
# field statistics,是否返回此字段所有向量总体统计分析数据,取值范围 true/false,默认 false
# offsets,是否返回词向量位置,取值范围 true/false,默认 true
# payloads,是否返回负载值,具体的存储位置,取值范围 true/false,默认 true
# positions,是否包含词项的顺序位置,取值范围 true/false,默认 true
# preference,选择分片,默认随机,详细前面参考search 搜索部分内容
# routing,路由参数
# realtime,是否实时性
# term_statistics,词向量统计所有统计,取值范围true/false,默认false
# version,数据版本号
# version_type,数据版本类型
GET kibana_sample_data_logs/_termvectors/roTR0Y8BbWz2Sn6EiJjA?fields=agent&term_statistics=true&realtime=true
# suggesters 启发式
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-suggesters.html
# termvectors 词项量
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/docs-termvectors.html
# highlighting 高亮
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/highlighting.html
# search-as-you-type 自定义搜索类型
# https://www.elastic.co/guide/en/elasticsearch/reference/8.6/search-as-you-type.html