es 3期 第16节-运用启发式特性引导用户查询

ops/2024/12/18 15:32:44/

#### 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


http://www.ppmy.cn/ops/142949.html

相关文章

机器学习-正则化技术

文章目录 拟合正则化正则项L1 正则化&#xff08;Lasso&#xff09;L2 正则化&#xff08;Ridge&#xff09; 多元线性回归的正则化回归形式代码 拟合 过拟合&#xff1a;参数&#xff08;特征&#xff09;过多&#xff08;理解为考虑很多因素)或者说过多专注于原来的训练数据…

智慧公交指挥中枢,数据可视化 BI 驾驶舱

随着智慧城市的蓬勃发展&#xff0c;公共交通作为城市运营的核心枢纽&#xff0c;正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network&#xff0c;控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术&#xff0c;构建的公交“大脑”…

每天40分玩转Django:简介和环境搭建

Django简介和环境搭建 一、课程概述 学习项目具体内容预计用时Django概念Django框架介绍、MVC/MTV模式、Django特点60分钟环境搭建Python安装、pip配置、Django安装、IDE选择45分钟创建项目项目结构、基本配置、运行测试75分钟实战练习创建个人博客项目框架60分钟 二、Djang…

期末复习-计算机网络应用题

目录 1 、简述具有五层协议体系结构的各层的主要功能&#xff1f; 2 、简述计算机网络协议分层能带来哪些好处&#xff1f; 3 、奈氏准则与香农公式在数据通信中的意义是什么&#xff1f; 4 、为什么局域网采用广播通信方式而广域网不采用呢&#xff1f; 5 、 以太网交换机…

Python TXT文件按条件批量删除行工具

Python TXT文本文件批量删除行工具 1.简介&#xff1a; 一个由Python编写的可根据TXT文件按条件批量删除行工具&#xff0c;资源及文件已打包成exe文件&#xff0c;源码也已经分享给大家&#xff0c;喜欢的话可以点个关注哦&#xff01; 功能&#xff1a; 批量删除行含关键字…

如何在NGINX中实现基于IP的访问控制(IP黑白名单)?

大家好&#xff0c;我是锋哥。今天分享关于【如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f; 1000道 互联网大…

智慧养老系统源码医院陪诊代办买药就医陪护上门护理小程序

市场前景 随着中国社会老龄化的不断加剧&#xff0c;老年人口比例的增加使得他们对医疗和陪护服务的需求日益突出。老年人在就医过程中往往需要更多的帮助和陪伴&#xff0c;而智慧养老陪诊护理系统能够为他们提供便捷、高效的就医辅助服务&#xff0c;满足他们的实际需求。此…

MacOs使用Wine 安装UaExpert与UaExpert的使用

要在 macOS 上使用 Wine 安装和运行 UaExpert&#xff0c;可以按照以下步骤操作&#xff1a; 安装 Wine 在 macOS 上&#xff0c;你可以通过 Homebrew 来安装 Wine。如果你还没有安装 Homebrew&#xff0c;可以先安装 Homebrew&#xff0c;然后使用它来安装 Wine。 bash /bin…