热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

分布式搜索引擎02

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

分布式搜索引擎02

 

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

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

 


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算法,公式如下

 

 

 

 

 



推荐阅读
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • Elasticsearch1Elasticsearch入门1.1Elasticsearch术语1.1.16.0以前的Elasticsearch术语1.1.26.0以后的Elasti ... [详细]
  • 一份来自清华的数据分析笔记,请查收!
    之前发过很多数据分析的文章,收到不少好评,但也有一些困惑:入门数据分析该学哪些知识点?该看哪些书?是从Pyth ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 摘要1:ElasticSearch比较两个时间的大小_gaojie_csdn的博客-CSDN博客_es时间比较摘要2:zlasticsearch脚本教 ... [详细]
  • 2.ElasticSearch练习索引 : sms-logs-index类型:sms-logs-type   数据导入部分PUTsms_logs_indexsms_logs_typ ... [详细]
  • 索引库类似于查字典的检索表或图书馆的书目检索,是搜索引擎将抓取的网页放入的地方。索引库通过词语来分类,利用固定数量的词语进行分类,方便搜索引擎匹配用户查询的词语。本文介绍了索引库的分类方式及其好处。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 大学生自学复制假饭卡:2个月卖出3千张,获利10万元!背后的神器长啥样?
    山东淄博的一名在校大学生通过自学复制饭卡的技术,2个月内成功卖出3千张假饭卡,获利10万元。他使用了一种特殊的设备来复制饭卡,并通过网店销售给其他学生。该学生已被刑拘。此事被发现是因为学校食堂管理员发现了大量负数的情况,经警方调查后发现是这名学生所为。他制作的假饭卡与真卡几乎一模一样,售价仅为面值的40%。该学生一共复制了三千多张饭卡,并已全部卖完,获利十万余元。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
author-avatar
飞翔的10号
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有