Elasticsearch的DSL搜索

一、数据准备

1.创建对应的索引库
2.给索引库创建对应的映射

POST 192.168.1.117:9200/sell/_mapping

{"properties": {"id": {"type": "long"},"age": {"type": "integer"},"username": {"type": "keyword"     // 该字段不会被分词,如果需要查询输入的内容必须和字段内容一致},"nickname": {"type": "text","analyzer": "ik_max_word"        //ik分词器的分词策略},"money": {"type": "float"},"desc": {"type": "text","analyzer": "ik_max_word"},"sex": {"type": "byte"},"birthday": {"type": "date"},"face": {"type": "text","index": false     // 不以该字段内容作为索引进行查询}}
}


3.录入对应的数据(这里就提供一条样例)

POST 192.168.1.117:9200/sell/_doc/1001

{"id": 1001,"age": 12,"username": "justsoso","nickname": "阿童木","money": "34.1","desc": "铁臂阿童木拯救世界","sex": 1,"birthday": "1997-12-22","face": "https://www.bejson.com/kuaikuai.php"
}


4.使用QueryString方式进行搜索

GET 192.168.1.117:9200/sell/_search?q=desc:詹姆斯


5.使用DSL方式查询数据

根据词语搜索对应的内容

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match": {"desc": "詹姆斯"}}
}


判断字段是否存在,存在的话就返回对应的内容,没有的话就返回空

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"exists": {"field": "username"}}
}

查询索引库中的所有数据

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match_all": {}}
}


自定义返回的字段

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match_all": {}},"_source": ["id","nickname","age"]
}


自定义返回的字段,并且设置分页

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match_all": {}},"_source": ["id","nickname","age"],"from": 0,"size": 10
}


使用term方式搜索,例如我们在IK分词器中设置:詹姆斯,詹,姆斯;三个词语,如果我们使用match搜索这个词语就会被分成上面三个词语进行搜索,如过使用term该词条就不会被进行分词搜索

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"term": {"desc": "詹姆斯"}}
}


使用term来进行多个词条搜索

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"terms": {"desc": ["詹姆斯", "哪吒", "VAVA"]}}
}

match_phrase搜索,在query中写的内容,对应的内容同时要包含 “我们” 和 “热爱”,并且包含内容必须是“我们热爱”,如果是 “热爱我们”,或者是中间有别的字在例如“我们的热爱”,就搜索不到,

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match_phrase": {"desc": {"query": "我们 热爱"}}},"_source": ["id","nickname","desc"]
}

match_phrase搜索,使用slop跳过字段搜索到对应的内容,例如的搜索条件是:“我们 大学”,目标内容是:“我们热爱学习,所以我要上大学”,正常来时是搜索不到的,因为这两个词语之间隔了8个字,但是我们可以使用 slop,例如:“slop”: 8,他的意思就是跳过8个字,刚好是间隔变为0个字,就可以正常命中目标了

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match_phrase": {"desc": {"query": "我们 大学","slop": 8}}},"_source": ["id","nickname","desc"]
}


match搜索的扩展"or"和"and",当operator是"and"的时候,就必须两个词条必须都存在某条数据中,没有顺序要求,如果是"or"的话就只需要有一个词条匹配到就可以了

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"match": {"desc": {"query": "我们 詹姆斯","operator": "and"}}}
}

match搜索的扩展"minimum_should_match",可以设置匹配度和匹配的格式,例如"我们真的很喜欢詹姆斯打篮球",这句话作为搜索条件,会被进行分词,如果minimum_should_match设置为60%,就是,索引库中的文档分词后和搜索条件的词条匹配度能达到60%就算是命中目标,或者minimum_should_match也可以是 1,就是目标和搜索词条的分词只有有1个一致,就算符合条件

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"match": {"desc": {"query": "我们 大学","minimum_should_match": 1}}}
}


match搜索的扩展"ids",通过id数组查询数据

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"ids": {"type": "_doc","values": ["1001", "1003", "1011"]}}
}

一个查询条件同时从两个字段中查询内容,还可以设置boost权重,权重越高,他的展示的排名越靠前,如果desc的文字内容比nickname的文字内容多,desc的权重会比nickname高,如果我们需要nickname权重增加可以通过""进行操作,"10"权重增加10

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"multi_match": {"query": "詹姆斯","fields": ["desc", "nickname^10"]}}
}


bool查询:must;multi_match和term是两个查询条条件,must就表示内容只有同时符合这两个条件才能被查出来

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"bool": {"must": [{"multi_match": {"query": "詹姆斯","fields": ["desc", "nickname"]}},{"term": {"sex": 1}}]}},"_source": ["id","sex","nickname","desc"]
}

bool查询:should;multi_match和term是两个查询条条件,should就表示内容只要满足其中一个内容就能被查询出来

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"bool": {"should": [{"multi_match": {"query": "詹姆斯","fields": ["desc", "nickname"]}},{"term": {"sex": 1}}]}},"_source": ["id","sex","nickname","desc"]
}

bool查询:must_not;multi_match和term是两个查询条条件,must_not都不满足这两个条件就能被查询出来

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"bool": {"must_not": [{"multi_match": {"query": "詹姆斯","fields": ["desc", "nickname"]}},{"term": {"sex": 1}}]}},"_source": ["id","sex","nickname","desc"]
}

bool查询的组合查询,must里的条件必须存在,should中的条件可有可无,must_not的条件必须不存在

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"bool": {"must": [{"match": {"desc": "詹姆斯"}}],"should": [{"match": {"sex": 0}}],"must_not": [{"term": {"birthday": "1992-12-12"}}]}},"_source": ["id","sex","nickname","desc"]
}

bool查询的组合查询,设置权重:“boost”: 2;权重越大排序越靠前

POST 192.168.1.117:9200/sell/_doc/_search

{    "query": {"bool": {"should": [{"match": {"desc": {"query": "詹姆斯","boost": 2}}},{"match": {"desc": {"query": "大学","boost": 20}}}]}},"_source": ["id","sex","nickname","desc"]
}


过滤器:post_filter;先通过query检索出对应的内容再通过post_filter过滤器过滤掉不符合条件的内容;(gt: 大于;lt: 小于;gte:大于等于;lte:小于等于)

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match": {"desc": "詹姆斯"}},"post_filter": {"range": {"money": {"gt": 0,"lt": 1000}}}
}

排序:sort;asc:升序,desc:降序

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match": {"desc": "詹姆斯"}},"sort": [{"money": "desc"},{"age": "asc"}]
}

使用text类型进行排序是会报错的,如果一定要使用text进行排序就需要给他添加一个新的属性:keyword

1.创建对应属性的索引库和映射

POST 192.168.1.117:9200/sell2/_mapping

{"properties": {"id": {"type": "long"},"nickname": {"type": "text","analyzer": "ik_max_word","fields": {"keyword": {"type": "keyword"}}}}
}


2.插入数据(只举一条例子)

POST 192.168.1.117:9200/sell2/_doc

{"id": 1001,"nickname": "詹姆斯"
}

使用nickname的keyword属性进行排序

POST 192.168.1.117:9200/sell2/_doc/_search

{"sort": [{"nickname.keyword": "desc"}]
}


搜索高亮显示,拼装分词的前后缀,pre_tags:前缀;post_tags:后缀

POST 192.168.1.117:9200/sell/_doc/_search

{"query": {"match": {"desc": "詹姆斯"}},"highlight": {"pre_tags": ["<span>"],"post_tags": ["</span>"],"fields": {"desc": {}}}
}

Elasticsearch的DSL搜索相关推荐

  1. 第三章 Elasticsearch Query DSL -- 查询

    第三章 Elasticsearch Query DSL -- 查询 摘要 查询和过滤的上下文(context) 相关性得分 查询上下文 过滤上下文 示例(下面这些查询参数,后续会详述) 全文查询 in ...

  2. ElasticSearch实现商品搜索与聚合分析

    ElasticSearch实现商品搜索与聚合分析 Gitee地址:https://gitee.com/yuyuuyuy/micro-mall 文章目录 ElasticSearch实现商品搜索与聚合分析 ...

  3. ElasticSearch 之 文本搜索

    ElasticSearch 之 文本搜索 1. 文本搜索简介 2. 倒排索引建立过程 3. 文本的搜索过程 4. 分析器简介 4.1. 字符过滤器 4.2. 分词器 4.3. 分词过滤器 5. 分析器 ...

  4. 商城项目(五)整合Elasticsearch实现商品搜索

    商城项目(五)整合Elasticsearch实现商品搜索 环境配置 Elasticsearch Elasticsearch 是一个分布式.可扩展.实时的搜索与数据分析引擎. 它能从项目一开始就赋予你的 ...

  5. 4 ElasticSearch RestFulAPI(DSL)

    ElasticSearch RestFulAPI(DSL) 1 全局操作 1.1 查看集群健康情况 API:GET /_cat/health?v ?v表示显示头信息 集群的健康状态有红.黄.绿三个状态 ...

  6. 整合Elasticsearch实现商品搜索

    整合Elasticsearch实现商品搜索 本文主要讲解mall整合Elasticsearch的过程,以实现商品信息在Elasticsearch中的导入.查询.修改.删除为例. 项目使用框架介绍 El ...

  7. 【Elasticsearch】如何使用 Elasticsearch 6.2 搜索中文、日语和韩语文本 - 第 3 部分:语言检测工具

    1.概述 翻译:https://www.elastic.co/cn/blog/how-to-search-ch-jp-kr-part-3 这是我有关中文.日语和韩语文本搜索的系列文章的第 3 部分.如 ...

  8. 【Elasticsearch】如何使用 Elasticsearch 6.2 搜索中文、日文和韩文文本 - 第 2 部分: 多字段

    1.概述 翻译:https://www.elastic.co/cn/blog/how-to-search-ch-jp-kr-part-2 如何使用 Elasticsearch 6.2 搜索中文.日文和 ...

  9. elasticsearch的rest搜索--- 查询

    目录: 一. 针对这次装B 的解释 二.下载,安装插件elasticsearch-1.7.0   三.索引的mapping 四. 查询 五.对于相关度的大牛的文档 四. 查询 1. 查询的官网的文档 ...

最新文章

  1. 计算机基础知识作业,第一章计算机基础知识作业
  2. php注入教程,php注入点构造代码实例详解
  3. C# 获得两日期之间所有月份(包括跨年)
  4. ajax绑定事件页面重复提交,Ajax局部更新导致JS事件重复触发问题的解决方法
  5. 通用的linux下安装配置svn独立服务
  6. rsync+inotify文件变动后自动同步程序
  7. P1868 饥饿的奶牛
  8. 直接学python3_初学者可以直接学Python3吗?
  9. Vue+ElementUI 限制结束时间不能大于开始时间
  10. 差分隐私若干基本知识点介绍(一)
  11. 作业4 | Lloyd-Max标量量化器DCMP基本原理
  12. 利用python的turtle库绘制玫瑰的步骤_用python turtle画玫瑰
  13. 视频类网站的简单研究
  14. GSMA MWC19巴塞罗那圆满落下帷幕
  15. S32DS使用Jlink下载S32K144程序记录
  16. 如何在一个服务器上建立两个(多个)网站
  17. 软工实践 - 第六次作业
  18. 上海财经大学计算机考研资料汇总
  19. 数仓领域的未来趋势解读
  20. IGBT-整流桥用-集成模块-相当于MOS管

热门文章

  1. 给div添加漂亮的边框背景图
  2. 服务器部署jdk,tomcat环境及腾讯云域名解析
  3. 大多数程序员都懂的java虚拟机:C1编译器从字节码到HIR
  4. 挖洞经验 | 利用Slack应用程序窃取Slack用户的下载文件
  5. 人民币大写的正确写法
  6. Android 注解与注解处理器简述
  7. 【机器人学】平面2R机器人(六)——MATLAB仿真
  8. 如何识别小米设备/MIUI系统或其他品牌手机
  9. 设计模式学习(汇总版)
  10. # Sql语句过长报错、查询慢优化方案探索