首页 > 其他分享 >分布式搜索引擎02

分布式搜索引擎02

时间:2022-09-18 10:00:45浏览次数:105  
标签:02 词条 搜索引擎 搜索 query 查询 geo match 分布式

分布式搜索引擎02

 

在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。

所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用DSL和RestClient实现搜索。

 

1.DSL查询文档

elasticsearch的查询依然是基于JSON风格的DSL来实现的。

1.1.DSL查询分类

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:

  • 查询所有:查询出所有数据,一般测试用。例如:match_all

  • 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:

    • match_query

    • multi_match_query

  • 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:

    • range

    • term

  • 地理(geo)查询:根据经纬度查询。例如:

    • geo_distance

    • geo_bounding_box

  • 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:

    • bool

    • function_score

 

查询的语法基本一致,我们以查询所有为例,其中:查询类型为match_all,没有查询条件

# 查询所有
GET /hotel/_search
{
  "query": {
    "match_all": { }
  }
}

其它查询无非就是查询类型、查询条件的变化。

 

1.2.全文检索查询

1.2.1.使用场景

全文检索查询的基本流程如下:

  • 对用户搜索的内容做分词,得到词条

  • 根据词条去倒排索引库中匹配,得到文档id

  • 根据文档id找到文档,返回给用户

比较常用的场景包括:

  • 商城的输入框搜索

  • 百度输入框搜索

例如京东:

因为是拿着词条去匹配,因此参与搜索的字段也必须是可分词的text类型的字段。

 

1.2.2.基本语法

常见的全文检索查询包括:

  • match查询:单字段查询

  • multi_match查询:多字段查询,任意一个字段符合条件就算符合查询条件

# match查询
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家外滩"
    }
  }
}

# mulit_match查询
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "如家外滩",
      "fields": ["name", " brand", "business"]
    }
  }
}

match查询示例:

multi_match查询示例:

可以看到,两种查询结果是一样的,为什么?

因为我们将brand、name、business值都利用copy_to复制到了all字段中。因此你根据三个字段搜索,和根据all字段搜索效果当然一样了。

但是,搜索字段越多,对查询性能影响越大,因此建议采用copy_to,然后单字段查询的方式。

1.2.4.总结

match和multi_match的区别是什么?

  • match:根据一个字段查询

  • multi_match:根据多个字段查询,参与查询字段越多,查询性能越差

 

1.3.精准查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:

  • term:根据词条精确值查询

  • range:根据值的范围查询

1.3.1.term查询

因为精确查询的字段搜是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,用户输入的内容跟自动值完全匹配时才认为符合条件。如果用户输入的内容过多,反而搜索不到数据。

示例:

# term查询
GET /hotel/_search
{
  "query": {
    "term": {
      "city": "上海"
    }
  }
}

当我搜索的是精确词条时,能正确查询出结果:

 但是,当我搜索的内容不是词条,而是多个词语形成的短语时,反而搜索不到:

 

1.3.2.range查询

范围查询,一般应用在对数值类型做范围过滤的时候。比如做价格范围过滤。

示例:

# range查询
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 500,
        "lte": 1000
      }
    }
  }
}

 

1.3.3.总结

精确查询常见的有哪些?

  • term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段

  • range查询:根据数值范围查询,可以是数值、日期的范围

 

1.4.地理坐标查询

所谓的地理坐标查询,其实就是根据经纬度查询

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/geo-queries.html

 

常见的使用场景包括:

  • 携程:搜索我附近的酒店

  • 滴滴:搜索我附近的出租车

  • 微信:搜索我附近的人

附近的酒店:

 

 

附近的车:

1.4.1.矩形范围查询

矩形范围查询,也就是geo_bounding_box查询,查询坐标落在某个矩形范围的所有文档。

 

查询时,需要指定矩形的左上、右下两个点的坐标,然后画出一个矩形,落在该矩形内的都是符合条件的点。

语法如下:

# geo_bounding_box查询
GET /hotel/_search
{
  "query": {
    "geo_bounding_box": {
      "location": {
        "top_left": {
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": {
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}

这种并不符合“附近的人”这样的需求,所以我们就不做了。

 

1.4.2.附近查询

附近查询,也叫做距离查询(geo_distance):查询到指定中心点小于某个距离值的所有文档。

 

换句话来说,在地图上找一个点作为圆心,以指定距离为半径,画一个圆,落在圆内的坐标都算符合条件:

 

示例:

我们先搜索陆家嘴附近15km的酒店

# geo_distance 查询,distance半径,location圆心
GET /hotel/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "location": "31.21, 121.5"
    }
  }
}

发现共有47家酒店。

 

然后把半径缩短到3公里:

可以发现,搜索到的酒店数量减少到了5家。

 

1.5.复合查询

复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑。常见的有两种:

  • fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名

  • bool query:布尔查询,利用逻辑关系组合多个其它的查询,实现复杂搜索

 

1.5.1.相关性算分

当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。

例如,我们搜索 "虹桥如家",结果如下:

[
    {
        "_score": 17.850193,
        "_source": {
            "name": "虹桥如家酒店真不错",
        }
    },
    {
        "_score": 12.259849,
        "_source": {
            "name": "外滩如家酒店真不错",
        }
    },
    {
        "_score": 11.91091,
        "_source": {
            "name": "迪士尼如家酒店真不错",
        }
    }
]

在elasticsearch中,早期使用的打分算法是TF-IDF算法,公式如下:

 

在后来的5.1版本升级中,elasticsearch将算法改进为BM25算法,公式如下

 

 

 

 

 

标签:02,词条,搜索引擎,搜索,query,查询,geo,match,分布式
From: https://www.cnblogs.com/Zz198/p/16704236.html

相关文章

  • camunda_02_installment
    CamundaPlatform7Run的下载和使用Camunda8的重点是SaaS,对于一般的工作流项目,还是传统的集成模式更好,所以仍然选择版本7,最新的是7.17版.注意事项java必......
  • 2022上半年软件设计师真题解析
    选择题 ......
  • CSP2022初赛游记
    Day-1早上去高中部复习初赛,做了一套提高组模拟,76,感觉初赛小心点就能过,就没复习了cmb顺便帮我们讲了一些快忘的知识点,我这才发现我不会枚举子集和主定理,而且我竟然连哈夫......
  • 2019-2020 ACM-ICPC Brazil Subregional Programming Contest D Denouncing Mafia
    DenouncingMafia贪心+线段树+\(dfs\)序考虑贪心地每次拿能染色最多的点,每拿走一个点,都会影响其他点的值,如果一个点被染色,则他子树的所有点的贡献值都会-1,因此考......
  • Microsoft Office LTSC 2021(office全家桶)Mac/win v16.65中文版
    MicrosoftOfficeMac/win是办公必备软件的集合,软件包括了Excel,Word,PPT等办公软件,每个应用程序旨在执行特定任务,并且创建这些应用程序是为了使您能够开始从事任何类型的项......
  • 题解【CF1702G2 Passable Paths (hard version)】
    题目传送门。考虑建立虚树然后再上面搞树形DP。于是这道题就变成分讨题。设\(f_i\)表示\(i\)子树内的答案。若\(f_i=1\),表示\(i\)子树内的特殊点可以被一条链覆......
  • 单位介绍信格式范文大全2022(6篇)
    摘要:介绍信格式范文大全,适用于单位介绍信范文2022年,共计六篇。1.单位介绍信范文2022年_________单位(管理档案处的全称):兹有_________(人名)的档案属于贵单位管理,现因本公......
  • 华为云分布式消息服务Kafka版
    下载Demo包https://dms-demo.obs.cn-north-1.myhuaweicloud.com/kafka-sdk-java-demo.zip详解Win10系统下打开.jks签名文件的方法https://blog.csdn.net/lr_201010/arti......
  • 2021 个人年度小结
    前言因为不用考研,所以大四一整年可以自由自在地学习一直以来想学却又没时间去学的东西。快乐的大四时光总是显得十分短暂,这篇博客主要用来总结过去一年所学的知识。基础......
  • JavaSe-day02-基本概念
    Java基本语法本章内容有注释,关键字,字面量,变量!注释什么是注释注释是在程序指定位置添加的说明性信息,就是对代码的一种解释。注释的分类1.单行注释格式://注释信息......