全文搜索两个最重要的方面是:相关性, 分析。

一旦谈论相关性或分析这两个方面的问题时,我们所处的语境是关于查询的而不是过滤

match:单个词查询

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "match": {
  5. "title": "QUICK!"
  6. }
  7. }
  8. }

步骤:1.分析字段类型,是string。2.分析查询字符串,得到一个单词quick。3.用term查询,在倒排索引中查找quick。4.为文档评分。

match:多个词查询

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "match": {
  5. "title": "BROWN DOG!"
  6. }
  7. }
  8. }

match 查询必须查找两个词( ["brown","dog"] ),它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。

上面的查询,哪怕只有一个brown或者是一个dog也会匹配。

如果要求一定要同时出现brown和dog两个词,则需要operator操作符。

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "match": {
  5. "title": {
  6. "query": "BROWN DOG!",
  7. "operator": "and" #and表示两个必须都匹配,or表示匹配一个即可
  8. }
  9. }
  10. }
  11. }

用minimum_should_match指定必须匹配的词项数。可以是百分比。

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "match": {
  5. "title": {
  6. "query": "quick brown dog",
  7. "minimum_should_match": "75%"
  8. }
  9. }
  10. }
  11. }

组合查询:

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": { "match": { "title": "quick" }},
  6. "must_not": { "match": { "title": "lazy" }},
  7. "should": [
  8. { "match": { "title": "brown" }},
  9. { "match": { "title": "dog" }}
  10. ]
  11. }
  12. }
  13. }

should语句的条件不是必须满足的,但是如果满足,则会增加文档的分数,即认为其更相关。

可以用minimum_should_match限制必须满足should的条件数。

  1. GET /my_index/my_type/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "should": [
  6. { "match": { "title": "brown" }},
  7. { "match": { "title": "fox" }},
  8. { "match": { "title": "dog" }}
  9. ],
  10. "minimum_should_match":
  11. }
  12. }
  13. }

下面的两个查询是等价的:

  1. {
  2. "match": {
  3. "title": {
  4. "query": "quick brown fox",
  5. "minimum_should_match": "75%"
  6. }
  7. }
  8. }
  1. {
  2. "bool": {
  3. "should": [
  4. { "term": { "title": "brown" }},
  5. { "term": { "title": "fox" }},
  6. { "term": { "title": "quick" }}
  7. ],
  8. "minimum_should_match":
  9. }
  10. }

下面两个查询等价:

  1. {
  2. "match": {
  3. "title": {
  4. "query": "brown fox",
  5. "operator": "and"
  6. }
  7. }
  8. }
  1. {
  2. "bool": {
  3. "must": [
  4. { "term": { "title": "brown" }},
  5. { "term": { "title": "fox" }}
  6. ]
  7. }
  8. }

用boost参数提高should条件的重要性。

我们想让包含 Lucene 的有更高的权重,并且包含 Elasticsearch 的语句比 Lucene 的权重更高

  1. GET /_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": {
  6. "match": {
  7. "content": {
  8. "query": "full text search",
  9. "operator": "and"
  10. }
  11. }
  12. },
  13. "should": [
  14. { "match": {
  15. "content": {
  16. "query": "Elasticsearch",
  17. "boost":
  18. }
  19. }},
  20. { "match": {
  21. "content": {
  22. "query": "Lucene",
  23. "boost":
  24. }
  25. }}
  26. ]
  27. }
  28. }
  29. }

boost 参数被用来提升一个语句的相对权重( boost 值大于 1 )或降低相对权重( boost值处于 0 到 1 之间)

原文后面还介绍了分析器和数据过少时的相关度问题。

【ES】学习5-全文搜索的更多相关文章

  1. SQL反模式学习笔记17 全文搜索

    目标:全文搜索 使用SQL搜索关键字,同时保证快速和精确,依旧是相当地困难. SQL的一个基本原理(以及SQL所继承的关系原理)就是一列中的单个数据是原子性的. 反模式:模式匹配 使用Like 或者正 ...

  2. 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询

    https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...

  3. Es学习第六课, ES基本搜索_search

    前面几课ES的基本概念.安装和分词都讲过了,下面我们就来实战一下ES的核心功能-搜索,这节课我们主要讲的是基本搜索 _search(注意:ES的关键字都要加前缀_,所以我们在定义索引.类型名称时不要带 ...

  4. Flask学习之十 全文搜索

    英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search 中文翻译地址:http://ww ...

  5. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)

    项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没 ...

  6. 精选SpringBoot八大开源项目:支付、秒杀、全文搜索等

    前言 曾在自己的博客中写下这样一段话:有一种力量无人能抵挡,它永不言败生来倔强.有一种理想照亮了迷茫,在那写满荣耀的地方. 如今,虽然没有大理想抱负,但是却有自己的小计划.下面是这一年来,自己利用闲暇 ...

  7. Es学习第一课,了解基本功能和概念

    Elasticsearch作为这几年最流行的搜索引擎,越来越多的互联网企业都在采用它:作为java开发者来说,如果想进一步提高自己能力,同时也为了能够在实际工作中遇到搜索.存储问题多一个解决方案,学习 ...

  8. [Elasticsearch] 全文搜索 (一) 基础概念和match查询

    全文搜索(Full Text Search) 现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档. 对于全文搜索而言,最重要的两个方面 ...

  9. coreseek实战(三):全文搜索在php中应用(使用api接口)

    coreseek实战(三):全文搜索在php中应用(使用api接口) 这一篇文章开始学习在php页面中通过api接口,使用coreseek全文搜索. 第一步:综合一下前两篇文章,coreseek实战( ...

随机推荐

  1. P2885 [USACO07NOV]电话线Telephone Wire

    P2885 [USACO07NOV]电话线Telephone Wire 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话 ...

  2. 解决编译安装php时报错:Please reinstall the iconv library

    编译安装php7时报错“Please reinstall the iconv library”,也就是让重新安装iconv库.但yum安装又提示“No package libiconv availab ...

  3. 在 github 新建一个文件夹

    创建新文件的时候名字后面加个斜杠(/)就可以了.

  4. CM记录-优化配置解决Reduce卡顿问题

    CDH大数据集群问题问题分析与解决方案 问题描述:Hive提交任务,一直卡在Reduce阶段,进度缓慢. 日志分析:NodeManager节点产生的usercache所在分区空间不足,导致进程异常退出 ...

  5. Log4net(一)-——配置文件

    一.Log4Net框架介绍 Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版.Log4net中定义了多种日志信息输出模式.它可以根据需要将日志输出到控制台,文本文件 ...

  6. oracle解除锁表【原】

    在日常操作中,经常会有不小心被锁表的情况发生 一般造成原因有: 开发人员不小心执行了 for update 查询语句后,没有解锁 不合理代码中开启事务(begin transaction)后,没有关闭 ...

  7. Java Web之路(一)Servlet

    前言 执行过程 Servlet 生命周期.工作原理:http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html Servlet的生命周期 ...

  8. Winform程序双向绑定

    程序比较简单,一看就明白,主要需要实现INotifyPropertyChanged using System; using System.Collections.Generic; using Syst ...

  9. [ZJOI2012]波浪弱化版(带技巧的DP)

    题面 \(solution:\) 这道确实挺难的,情况特别多,而且考场上都没想到如何设置状态.感觉怎么设状态不能很好的表示当前情况并转移,考后发现是对全排列的构造方式不熟而导致的,而这一题的状态也是根 ...

  10. python队列queue 之优先级队列

    import queue as Q def PriorityQueue_int(): que = Q.PriorityQueue() que.put(10) que.put(1) que.put(5) ...