第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

1、elasticsearch(搜索引擎)的查询

elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据

查询分类:
  基本查询:使用elasticsearch内置的查询条件进行查询
  组合查询:把多个查询条件组合在一起进行复合查询
  过滤:查询同时,通过filter条件在不影响打分的情况下筛选数据

2、elasticsearch(搜索引擎)创建数据

首先我们先创建索引、表、以及字段属性、字段类型、添加好数据

注意:一般我们中文使用ik_max_word中文分词解析器,所有在需要分词建立倒牌索引的字段都要指定,ik_max_word中文分词解析器
系统默认不是ik_max_word中文分词解析器

ik_max_word中文分词解析器是elasticsearch(搜索引擎)的一个插件,在elasticsearch安装目录的plugins/analysis-ik文件夹里,版本为5.1.1

更多说明:https://github.com/medcl/elasticsearch-analysis-ik

说明:

  1. #创建索引(设置字段类型)
  2. #注意:一般我们中文使用ik_max_word中文分词解析器,所有在需要分词建立倒牌索引的字段都要指定,ik_max_word中文分词解析器
  3. #系统默认不是ik_max_word中文分词解析器
  4. PUT jobbole #创建索引设置索引名称
  5. {
  6. "mappings": { #设置mappings映射字段类型
  7. "job": { #表名称
  8. "properties": { #设置字段类型
  9. "title":{ #表名称
  10. "store": true, #字段属性true表示保存数据
  11. "type": "text", #text类型,text类型可以分词,建立倒排索引
  12. "analyzer": "ik_max_word" #设置分词解析器,ik_max_word是一个中文分词解析器插件
  13. },
  14. "company_name":{ #字段名称
  15. "store": true, #字段属性true表示保存数据
  16. "type": "keyword" #keyword普通字符串类型,不分词
  17. },
  18. "desc":{ #字段名称
  19. "type": "text" #text类型,text类型可以分词,但是没有设置分词解析器,使用系统默认
  20. },
  21. "comments":{ #字段名称
  22. "type": "integer" #integer数字类型
  23. },
  24. "add_time":{ #字段名称
  25. "type": "date", #date时间类型
  26. "format":"yyyy-MM-dd" #yyyy-MM-dd时间格式化
  27. }
  28. }
  29. }
  30. }
  31. }
  32.  
  33.  
  34. #保存文档(相当于数据库的写入数据)
  35. POST jobbole/job
  36. {
  37. "title":"python django 开发工程师", #字段名称:值
  38. "company_name":"美团科技有限公司", #字段名称:值
  39. "desc":"对django的概念熟悉, 熟悉python基础知识", #字段名称:值
  40. "comments":20, #字段名称:值
  41. "add_time":"2017-4-1" #字段名称:值
  42. }
  43.  
  44. POST jobbole/job
  45. {
  46. "title":"python scrapy redis 分布式爬虫基础",
  47. "company_name":"玉秀科技有限公司",
  48. "desc":"对scrapy的概念熟悉, 熟悉redis基础知识",
  49. "comments":5,
  50. "add_time":"2017-4-2"
  51. }
  52.  
  53. POST jobbole/job
  54. {
  55. "title":"elasticsearch打造搜索引擎",
  56. "company_name":"通讯科技有限公司",
  57. "desc":"对elasticsearch的概念熟悉",
  58. "comments":10,
  59. "add_time":"2017-4-3"
  60. }
  61.  
  62. POST jobbole/job
  63. {
  64. "title":"pyhhon打造推荐引擎系统",
  65. "company_name":"智能科技有限公司",
  66. "desc":"熟悉推荐引擎系统算法",
  67. "comments":60,
  68. "add_time":"2017-4-4"
  69. }

 通过上面可以看到我们创建了索引并且设置好了字段的属性、类型、以及分词解析器,创建了4条数据

3、elasticsearch(搜索引擎)基本查询

match查询【用的最多】
会将我们的搜索词在当前字段设置的分词器进行分词,到当前字段查找,匹配度越高排名靠前,如果搜索词是大写字母会自动转换成小写

  1. #match查询
  2. #会将我们的搜索词进行分词,到指定字段查找,匹配度越高排名靠前
  3. GET jobbole/job/_search
  4. {
  5. "query": {
  6. "match": {
  7. "title": "搜索引擎"
  8. }
  9. }
  10. }

term查询
不会将我们的搜索词进行分词,将搜索词完全匹配的查询

  1. #term查询
  2. #不会将我们的搜索词进行分词,将搜索词完全匹配的查询
  3. GET jobbole/job/_search
  4. {
  5. "query": {
  6. "term": {
  7. "title":"搜索引擎"
  8. }
  9. }
  10. }

terms查询
传递一个数组,将数组里的词分别匹配

  1. #terms查询
  2. #传递一个数组,将数组里的词分别匹配
  3. GET jobbole/job/_search
  4. {
  5. "query": {
  6. "terms": {
  7. "title":["工程师","django","系统"]
  8. }
  9. }
  10. }

控制查询的返回数量
  from从第几条数据开始
  size获取几条数据

  1. #控制查询的返回数量
  2. #from从第几条数据开始
  3. #size获取几条数据
  4. GET jobbole/job/_search
  5. {
  6. "query": {
  7. "match": {
  8. "title": "搜索引擎"
  9. }
  10. },
  11. "from": 0,
  12. "size": 3
  13. }

match_all查询,查询所有数据

  1. #match_all查询,查询所有数据
  2. GET jobbole/job/_search
  3. {
  4. "query": {
  5. "match_all": {}
  6. }
  7. }

match_phrase查询
短语查询
短语查询,会将搜索词分词,放进一个列表如[python,开发]
然后搜索的字段必须满足列表里的所有元素,才符合
slop是设置分词后[python,开发]python 与 开发,之间隔着多少个字符算匹配
间隔字符数小于slop设置算匹配到,间隔字符数大于slop设置不匹配

  1. #match_phrase查询
  2. #短语查询
  3. #短语查询,会将搜索词分词,放进一个列表如[python,开发]
  4. #然后搜索的字段必须满足列表里的所有元素,才符合
  5. #slop是设置分词后[python,开发]python 与 开发,之间隔着多少个字符算匹配
  6. #间隔字符数小于slop设置算匹配到,间隔字符数大于slop设置不匹配
  7. GET jobbole/job/_search
  8. {
  9. "query": {
  10. "match_phrase": {
  11. "title": {
  12. "query": "elasticsearch引擎",
  13. "slop":3
  14. }
  15. }
  16. }
  17. }

multi_match查询
比如可以指定多个字段
比如查询title字段和desc字段里面包含python的关键词数据
query设置搜索词
fields要搜索的字段
title^3表示权重,表示title里符合的关键词权重,是其他字段里符合的关键词权重的3倍

  1. #multi_match查询
  2. #比如可以指定多个字段
  3. #比如查询title字段和desc字段里面包含python的关键词数据
  4. #query设置搜索词
  5. #fields要搜索的字段
  6. #title^3表示权重,表示title里符合的关键词权重,是其他字段里符合的关键词权重的3倍
  7. GET jobbole/job/_search
  8. {
  9. "query": {
  10. "multi_match": {
  11. "query": "搜索引擎",
  12. "fields": ["title^3","desc"]
  13. }
  14. }
  15. }

stored_fields设置搜索结果只显示哪些字段

注意:使用stored_fields要显示的字段store属性必须为true,如果要显示的字段没有设置store属性那么默认为false,如果为false将不会显示该字段

  1. #stored_fields设置搜索结果只显示哪些字段
  2. GET jobbole/job/_search
  3. {
  4. "stored_fields": ["title","company_name"],
  5. "query": {
  6. "multi_match": {
  7. "query": "搜索引擎",
  8. "fields": ["title^3","desc"]
  9. }
  10. }
  11. }

通过sort搜索结果排序
注意:排序的字段必须是数字或者日期
desc升序
asc降序

  1. #通过sort搜索结果排序
  2. #注意:排序的字段必须是数字或者日期
  3. #desc升序
  4. #asc降序
  5. GET jobbole/job/_search
  6. {
  7. "query": {
  8. "match_all": {}
  9. },
  10. "sort": [{
  11. "comments": {
  12. "order": "asc"
  13. }
  14. }]
  15. }

range字段值范围查询
查询一个字段的值范围
注意:字段值必须是数字或者时间
gte大于等于
ge大于
lte小于等于
lt小于
boost是权重,可以给指定字段设置一个权重

  1. #range字段值范围查询
  2. #查询一个字段的值范围
  3. #注意:字段值必须是数字或者时间
  4. #gte大于等于
  5. #ge大于
  6. #lte小于等于
  7. #lt小于
  8. #boost是权重,可以给指定字段设置一个权重
  9. GET jobbole/job/_search
  10. {
  11. "query": {
  12. "range": {
  13. "comments": {
  14. "gte": 10,
  15. "lte": 20,
  16. "boost": 2.0
  17. }
  18. }
  19. }
  20. }

range字段值为时间范围查询

  1. #range字段值为时间范围查询
  2. #查询一个字段的时间值范围
  3. #注意:字段值必须是时间
  4. #gte大于等于
  5. #ge大于
  6. #lte小于等于
  7. #lt小于
  8. #now为当前时间
  9. GET jobbole/job/_search
  10. {
  11. "query": {
  12. "range": {
  13. "add_time": {
  14. "gte": "2017-4-1",
  15. "lte": "now"
  16. }
  17. }
  18. }
  19. }

wildcard查询,通配符查询
*代表一个或者多个任意字符

  1. #wildcard查询,通配符查询
  2. #*代表一个或者多个任意字符
  3. GET jobbole/job/_search
  4. {
  5. "query": {
  6. "wildcard": {
  7. "title": {
  8. "value": "py*n",
  9. "boost": 2
  10. }
  11. }
  12. }
  13. }

fuzzy模糊查询

  1. #fuzzy模糊搜索
  2. #搜索包含词的内容
  3. GET lagou/biao/_search
  4. {
  5. "query": {
  6. "fuzzy": {"title": "广告"}
  7. },
  8. "_source": ["title"]
  9. }
  10.  
  11. #fuzziness设置编辑距离,编辑距离就是把要查找的字段值,编辑成查找的关键词需要编辑多少个步骤(插入、删除、替换)
  12. #prefix_length为关键词前面不参与变换的长度
  13. GET lagou/biao/_search
  14. {
  15. "query": {
  16. "fuzzy": {
  17. "title": {
  18. "value": "广告录音",
  19. "fuzziness": 2,
  20. "prefix_length": 2
  21. }
  22. }
  23. },
  24. "_source": ["title"]
  25. }

第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询的更多相关文章

  1. 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  2. 第三百六十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mget和bulk批量操作

    第三百六十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mget和bulk批量操作 注意:前面讲到的各种操作都是一次http请求操作一条数据,如果想 ...

  3. 第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能

    第三百六十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索功能 Django实现搜索功能 1.在Django配置搜索结果页的路由映 ...

  4. 第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询

    第三百六十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的bool组合查询 bool查询说明 filter:[],字段的过滤,不参与打分must:[] ...

  5. 第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

    第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字 ...

  6. 第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念

    第三百六十节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念 elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点 ...

  7. 第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装

    第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装 elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于 ...

  8. 第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现,回填数据以及错误提示html

    第三百八十五节,Django+Xadmin打造上线标准的在线教育平台—登录功能实现 1,配置登录路由 from django.conf.urls import url, include # 导入dja ...

  9. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

随机推荐

  1. 菜鸟学Java(五)——JSP内置对象之request

    书接上回,上次跟大家概括的说了说JSP的九种常用内置对象.接下来就该聊聊它们各自的特点了,今天先说说request吧. 下面是request的一些常用方法: isUserInRole(String r ...

  2. 关于在node项目使用ioredis遇到的几个坑

    1,在ioredis中使用redis命令的方法的时候,如果有2个以上的参数,必须使用then方法来接收返回的结果,比如: redis.hget('key','field').then(function ...

  3. Java 的 I/O 类库的基本架构

    Java 的 I/O 类库的基本架构 I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代, ...

  4. memory-based 协同过滤(CF)方法

    协同过滤(collaborative filtering,CF)算法主要分为memory-based CF 和 model-based CF,而memory-based CF 包括user-based ...

  5. pip3 install jupyter出现错误

    问题描述 出现如下错误: Command "/Users/wang/.pyenv/versions/3.3.1/bin/python3.3 -u -c "import setupt ...

  6. Centos6.9安装JDK1.8

    https://blog.csdn.net/zhangjm123/article/details/80784930

  7. Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

    本文把makefile 分成了三份:生成可执行文件的makefile,生成静态链接库的makefile,生成动态链接库的makefile. 这些makefile都很简单,一般都是一看就会用,用法也很容 ...

  8. 【转】关于 SELECT /*!40001 SQL_NO_CACHE */ * FROM 的解惑

    由于 在数据库做了缓存,在对数据库做了备份,然后在慢查询日志中发现了这一串字符: SELECT /*!40001 SQL_NO_CACHE */ * FROM 上网查了一下,发现好多答案,好多人说的都 ...

  9. C#如何删除数组中的一个元素

    C#如何删除数组中的一个元素,剩余的元素组成新数组,数组名不变double[] arr = new double[n];需要删除的是第m+1个数据arr[m]求新数组arr.(新数组arr包含n-1个 ...

  10. 问题-DelphiXE10.1 FireDAC联接oracle数据库方法

    问题现象:安装oracle后,安装Delphi10.1,放FDConnection1时,选择"Ora"驱动时,提示如下: [FireDAC][Phys][Ora]-315. Can ...