(四)ElasticSearch实战进阶教程(ElasticSearch深入搜索)
1.基于词项和基于全文的检索
1.1 基于Term的查询
- Term的重要性
- Term是表达语义的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理Term
- 特点
- Term Level Query:Term Query/Range Query/Exists Query/Prefix Query/Wildcard Query
- 在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分- (Apple Store)
- 可以通过Constant Score 将查询转换成一个Filtering,避免算分,并利用缓存,提高性能
1.1.1多字段Mapping 和Term 查询
- 可以为其增加keyword 来完成完成匹配
- term查询是不会进行分词的(ES会做 默认的分词处理 )
GET my_store/_search
{
"query": {
"term": {
"productName": {
"value": "ZHANGSAN"
//zhangsan
}
}
}
}
GET my_store/_search
{
"query": {
"term": {
"productName.keyword": {
"value": "ZHANGSAN"
}
}
}
}
1.2 复合查询 -Constant Score 转为Filter
- 将Query 装成Filter,忽略TF-IDF,避免相关性算分的开销
- Filter可以有效利用缓存
- 即便是对KeyWord进行Term 查询,同样会进行算分
- 可以将查询转为Filtering,取消相关性算分的环节,以提升性能
POST my_store/_search
{
"explain": true,
"query": {
"constant_score": {
"filter": {
"term": {
"productName.keyword": "ZHANGSAN"
}
},
"boost": 1.2
}
}
}
1.3 基于全文的查询
- 基于全文本的查找
- Match Query/Match Phrase Query /Query String Query
- 特点
- 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器然后生成一个供查询的词项列表
- 查询时候,先会对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并。并为每个文档生成一个算分。-例如查 “Matrix reloaded” 会查到包括Matrix 或者reload 的所有结果
1.4 Match Query
- 返回所有包含该值的数据
POST my_store/_search
{
"query": {
"match": {
"content":{
"query": "zhang san"
}
}
}
}
"hits": {
"total": 3,
"max_score": 1.0942618,
"hits": [
{
"_index": "my_store",
"_type": "products",
"_id": "AXdIzZf2EQcMCfQJ7URS",
"_score": 1.0942618,
"_source": {
"content": "my name is zhang san"
}
},
{
"_index": "my_store",
"_type": "products",
"_id": "AXdIzcDtomOanSvnaKZX",
"_score": 0.13112299,
"_source": {
"content": "my name is wang san"
}
},
{
"_index": "my_store",
"_type": "products",
"_id": "AXdIza-1omOanSvnaKZV",
"_score": 0.13112299,
"_source": {
"content": "my name is li san"
}
}
]
}
1.4.1 Operator
- 可以使用Operator来控制 query
POST my_store/_search
{
"profile":true,
"query": {
"match": {
"content":{
"query": "zhang san",
"operator": "and"
}
}
}
}
1.4.2 Match Phrase Query
- 引用位置的信息使其查询更加精准
POST my_store/_search
{
"profile":true,
"query": {
"match_phrase": {
"content":{
"query": "zhang san",
"slop":1
}
}
}
}
1.4.3 Match Query 查询过程
- 基于全文本的查找
- Match Query/Match Phrase Query/Query String Query
- 基于全文本的查询特点
- 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表
- 查询会对每个词项逐个进行底层的查询,再将结果进行合并。并为每个文档生成一个算分
2 结构化搜索
2.1 结构化数据
- 结构化搜索(Structured search)是指对结构化数据的搜索
- 日期,布尔类型和数字都是结构化的
- 文本也是可以结构化的
- 如彩色笔可以有离散的颜色集合red,green,blue
- 一个博客可能被标记了标签,例如分布式和搜索
- 电商网站上的商品都有UPCs(通用产品码 Universal Product Codes)或其他的唯一标识,他们都需要遵从严格的约定,结构化的格式
2.2 ES中的结构化搜索
- 布尔,时间,日期和数字这类结构化数据:有精确的格式,我们可以对这些格式进行逻辑操作。包括比较数字或时间的范围,或判定两个值的大小
- 结构化的文本可以做精确匹配或者部分匹配
- Term查询/Prefix 前缀查询
- 结构化只有(是,否)两个值
- 根据场景需要,可以决定结构化搜索是否需要打分
本文作者:张三Blog
本文链接:https://www.cnblogs.com/zhangsan-plus/p/16503285.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步