ElasticSearch 集群架构与搜索深入理解(中)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ElasticSearch 集群架构与搜索深入理解

5.3、boost权重控制


搜索document中remark字段中包含java的数据,如果remark中包含developer

或architect,则包含architect的document优先显示。(就是将architect数据匹

配时的相关度分数增加)。


一般用于搜索时相关度排序使用。如:电商中的综合排序。将一个商品的销

量,广告投放,评价值,库存,单价比较综合排序。在上述的排序元素中,广告投

放权重最高,库存权重最低。


GET /es_db/_search 
 {
 "query":{
 "bool":{
 "must":[
 {
 "match":{
 "remark":"java"
 }
 }
 ],
 "should":[
 {
 "match":{
 "remark":{
 "query":"developer",
 "boost":1
 }
 }
 },
 {
 "match":{
 "remark":{
 "query":"architect",
 "boost":3
 }
 }
 }
 ]
 }
 }
 }

5.4、基于dis_max实现best fields策略进行多字段搜索


best fields策略: 搜索的document中的某一个field,尽可能多的匹配搜索条件。与之相反的是,尽可能多的字段匹配到搜索条件(most fields策略)。如百度搜索使用这种策略。

优点:精确匹配的数据可以尽可能的排列在最前端,且可以通过 minimum_should_match来去除长尾数据,避免长尾数据字段对排序结果的影响。


长尾数据比如说我们搜索4个关键词,但很多文档只匹配1个,也显示出来了,这些文档其实不是我们想要的


缺点:相对排序不均匀。


dis_max语法: 直接获取搜索的多条件中的,单条件query相关度分数最高的数据,以这个数据做相关度排序。

下述的案例中,就是找name字段中rod匹配相关度分数或remark字段中java

developer匹配相关度分数,哪个高,就使用哪一个相关度分数进行结果排序。


GET /es_db/_search 
{ 
"query": { 
"dis_max": { 
"queries": [ 
{ 
"match": { "name": "rod" 
} 
}, 
{ 
"match": { 
"remark": "java developer" 
} 
} 
] 
} 
} 
} 
# 返回结果
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-minimal-setup.html to enable security.
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.6375021,
    "hits" : [
      {
        "_index" : "es_db",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.6375021,
        "_source" : {
          "name" : "rod",
          "sex" : 0,
          "age" : 26,
          "address" : "广州白云山公园",
          "remark" : "php developer"
        }
      },
      {
        "_index" : "es_db",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.4691012,
        "_source" : {
          "name" : "张三",
          "sex" : 1,
          "age" : 25,
          "address" : "广州天河公园",
          "remark" : "java developer"
        }
      },
      {
        "_index" : "es_db",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.5598161,
        "_source" : {
          "name" : "李四",
          "sex" : 1,
          "age" : 28,
          "address" : "广州荔湾大厦",
          "remark" : "java assistant"
        }
      },
      {
        "_index" : "es_db",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 0.46919835,
        "_source" : {
          "name" : "小明",
          "sex" : 0,
          "age" : 19,
          "address" : "长沙岳麓山",
          "remark" : "java architect assistant"
        }
      }
    ]
  }
}

5.5、基于tie_breaker参数优化dis_max搜索效果


dis_max是将多个搜索query条件中相关度分数最高的用于结果排序,忽略其他 query分数,在某些情况下,可能还需要其他query条件中的相关度介入最终的结果排序,这个时候可以使用tie_breaker参数来优化dis_max搜索。


tie_breaker参数代表的含义是:将其他query搜索条件的相关度分数乘以参数值,再参与到结果排序中。如果不定义此参数,相当于参数值为0。所以其他query条件的相关度分数被忽略。


GET /es_db/_search 
{ 
"query": { 
"dis_max": { 
"queries": [ 
{ 
"match": { 
"name": "rod" 
} 
}, 
{ 
"match": { 
"remark": "java developer" 
} 
} 
], 
"tie_breaker":0.5 
} 
}
} 

5.6、使用multi_match简化dis_max+tie_breaker


ES中相同结果的搜索也可以使用不同的语法语句来实现。不需要特别关注,只要能够实现搜索,就是完成任务!


如:


GET /es_db/_search
{
"query":{
"dis_max":{
"queries":[
{
"match":{
"name":"rod"
}
},
{
"match":{
"remark":{
"query":"javadeveloper",
"boost":2,
"minimum_should_match":2
}
}
}
],
"tie_breaker":0.5
}
}
}
# 返回结果
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-minimal-setup.html to enable security.
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.6375021,
    "hits" : [
      {
        "_index" : "es_db",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.6375021,
        "_source" : {
          "name" : "rod",
          "sex" : 0,
          "age" : 26,
          "address" : "广州白云山公园",
          "remark" : "php developer"
        }
      }
    ]
  }
}
#使用multi_match语法为:其中type常用的有best_fields和most_fields。^n代表权重,相当于"boost":n。
GET /es_db/_search
{
"query":{
"multi_match":{
  "query": "rod java developer",
  "fields": ["name","remark^2"],
  "type": "best_fields",
  "tie_breaker": 0.5,
  "minimum_should_match": "50%"
}
}
}

5.7、cross fields搜索


cross fields : 一个唯一的标识,分部在多个fields中,使用这种唯一标识

搜索数据就称为cross fields搜索。如:人名可以分为姓和名,地址可以分为省、

市、区县、街道等。那么使用人名或地址来搜索document,就称为cross fields搜

索。


实现这种搜索,一般都是使用most fields搜索策略。因为这就不是一个field

的问题。


**Cross fields搜索策略,是从多个字段中搜索条件数据。默认情况下,和most **

**fields搜索的逻辑是一致的,计算相关度分数是和best fields策略一致的。一般 **

**来说,如果使用cross fields搜索策略,那么都会携带一个额外的参数operator。 **

**用来标记搜索条件如何在多个字段中匹配。 **


当然,在ES中也有cross fields搜索策略。具体语法如下:


GET /es_db/_search 
{ 
"query": { 
"multi_match": { 
"query": "java developer", 
"fields": ["name", "remark"], 
"type": "cross_fields", 
"operator" : "and" 
} 
} 
} 


上述语法代表的是,搜索条件中的java必须在name或remark字段中匹配, developer也必须在name或remark字段中匹配。most field策略问题:most fields策略是尽可能匹配更多的字段,所以会导致 精确搜索结果排序问题。又因为cross fields搜索,不能使用

minimum_should_match来去除长尾数据。


所以在使用most fields和cross fields策略搜索数据的时候,都有不同的缺陷。所以商业项目开发中,都推荐使用best fields策略实现搜索。


5.8、copy_to组合fields


京东中,如果在搜索框中输入“手机”,点击搜索,那么是在商品的类型名称、商品的名称、商品的卖点、商品的描述等字段中,哪一个字段内进行数据的匹配?如果使用某一个字段做搜索不合适,那么使用_all做搜索是否合适?也不合适,因为_all字段中可能包含图片,价格等字段。假设,有一个字段,其中的内容包括(但不限于):商品类型名称、商品名称、 商品卖点等字段的数据内容。是否可以在这个特殊的字段上进行数据搜索匹配?


{
"category_name" : "手机",
"product_name" : "一加6T手机",
"price" : 568800,
"sell_point" : "国产最好的Android手机",
"tags": ["8G+128G", "256G可扩展"],
"color" : "红色",
"keyword" : "手机 一加6T手机 国产最好的Android手机"
}


copy_to : 就是将多个字段,复制到一个字段中,实现一个多字段组合。copy_to 可以解决cross fields搜索问题,在商业项目中,也用于解决搜索条件默认字段问题。


如果需要使用copy_to语法,则需要在定义index的时候,手工指定mapping映射策略。


copy_to语法:


PUT /es_db/_mapping
{
"properties": {
"provice" : {
"type": "text",
"analyzer": "standard",
"copy_to": "address"
},
"city" : {
"type": "text",
"analyzer": "standard",
"copy_to": "address"
},
"street" : {
"type": "text",
"analyzer": "standard",
"copy_to": "address"
},
"address" : {
"type": "text",
"analyzer": "standard"
}
}
}


上述的mapping定义中,是新增了4个字段,分别是provice、city、street、 address,其中provice、city、street三个字段的值,会自动复制到address字段中,实现一个字段的组合。那么在搜索地址的时候,就可以在address字段中做条件匹配,从而避免most fields策略导致的问题。在维护数据的时候,不需对address字段特殊的维护。因address字段是一个组合字段,是由ES自动维护的。


类似java代码中的推导属性。在存储的时候,未必存在,但是在逻辑上是一定存在的,因为address是由3个物理存在的属性province、city、street组成的。


5.9、近似匹配


前文都是精确匹配。如doc中有数据java assistant,那么搜索jave是搜索不到数据的。因为jave单词在doc中是不存在的。


如果搜索的语法是:


GET _search 
{ 
"query" : { 
"match" : { 
"name" : "jave" 
}
} 
} 


如果需要的结果是有特殊要求,如:hello world必须是一个完整的短语,不可分割;或document中的field内,包含的hello和world单词,且两个单词之间离的越近,相关度分数越高。那么这种特殊要求的搜索就是近似搜索。包括hell搜索条件在hello world数据中搜索,包括h搜索提示等都数据近似搜索的一部分。


如何上述特殊要求的搜索,使用match搜索语法就无法实现了。


5.10、match phrase


短语搜索。**就是搜索条件不分词。代表搜索条件不可分割。 **


如果hello world是一个不可分割的短语,我们可以使用前文学过的短语搜索

match phrase来实现。语法如下:


GET _search 
{ 
"query": { 
"match_phrase": { 
"remark": "java assistant" 
} 
} 
} 


**-1)、 match phrase原理 -- term position **


ES是如何实现match phrase短语搜索的?其实在ES中,使用match phrase做搜索的时候,也是和match类似,首先对搜索条件进行分词-analyze。将搜索条件拆分成hello和world。既然是分词后再搜索,ES是如何实现短语搜索的?


这里涉及到了倒排索引的建立过程。在倒排索引建立的时候,ES会先对document数据进行分词,如:


GET _analyze 
{ 
"text": "hello world, java spark", 
"analyzer": "standard" 
}


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
9天前
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案
106 3
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
|
21天前
|
机器学习/深度学习 人工智能 运维
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
阿里云技术公开课预告:Elastic和阿里云搜索技术专家将深入解读阿里云Elasticsearch Enterprise版的AI功能及其在实际应用。
127 2
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
|
6天前
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案。
|
24天前
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
|
20天前
|
搜索推荐 API 定位技术
一文看懂Elasticsearch的技术架构:高效、精准的搜索神器
Elasticsearch 是一个基于 Lucene 的开源搜索引擎,以其强大的全文本搜索功能和快速的倒排索引技术著称。它不仅支持数字、文本、地理位置等多类型数据,还提供了可调相关度分数、高级查询 DSL 等功能。Elasticsearch 的核心技术流程包括数据导入、解析、索引化、查询处理、得分计算及结果返回,确保高效处理大规模数据并提供准确的搜索结果。通过 RESTful API、Logstash 和 Filebeat 等工具,Elasticsearch 可以从多种数据源中导入和解析数据,支持复杂的查询需求。
82 0
|
20天前
|
存储 负载均衡 监控
揭秘 Elasticsearch 集群架构,解锁大数据处理神器
Elasticsearch 是一个强大的分布式搜索和分析引擎,广泛应用于大数据处理、实时搜索和分析。本文深入探讨了 Elasticsearch 集群的架构和特性,包括高可用性和负载均衡,以及主节点、数据节点、协调节点和 Ingest 节点的角色和功能。
41 0
|
2月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
59 1
|
2月前
|
监控 Java 测试技术
Elasticsearch集群JVM调优垃圾回收器的选择
Elasticsearch集群JVM调优垃圾回收器的选择
67 1
|
2月前
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
69 5
|
3月前
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
295 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。