ElasticSearch 系列文章

1 ES 入门之一 安装ElasticSearcha

2 ES 记录之如何创建一个索引映射

3 ElasticSearch 学习记录之Text keyword 两种基本类型区别

4 ES 入门记录之 match和term查询的区别

5 ElasticSearch 学习记录之ES几种常见的聚合操作

6 ElasticSearch 学习记录之父子结构的查询

7 ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

8 ElasticSearch 学习记录之ES高亮搜索

9 ElasticSearch 学习记录之ES短语匹配基本用法

10 ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

11 ElasticSearch 学习记录之集群分片内部原理

12 ElasticSearch 学习记录之ES如何操作Lucene段

13 ElasticSearch 学习记录之如任何设计可扩容的索引结构

14 ElasticSearch之 控制相关度原理讲解

短语匹配

短语匹配故名思意就是对分词后的短语就是匹配,而不是仅仅对单独的单词进行匹配

下面就是根据下面的脚本例子来看整个短语匹配的有哪些作用和优点

GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
//查询分词之后连续的
//例如 brown fox 可以查询到,但是quick fox 查询不到
//也可以使用下面的方式,这两种方式是相同的,只不过写法不同而已 POST /product/_search
{
"query": {
"match": {
"name":{
"query": "1130 对接",
"type": "phrase"
}
}
}
}

根据上面的我们对短语匹配有些总结

  1. quick 、 brown 和 fox 需要全部出现在域中
  2. brown 的位置应该比 quick 的位置大 1
  3. fox 的位置应该比 quick 的位置大 2
  4. 上面任何一个选项不成立,则该文档不能认定为匹配

对 短语查询进行一些优化

通过加入slop参数,可以灵活的控制短语查询的,

slop 参数告诉 match_phrase 查询词条相隔多远时仍然能将文档视为匹配

POST product/_search
{
"query": {
"match_phrase": {
"name": {
"query": "1130 对接 测试",
"slop" : 10
}
}
}
}

越近越好,当我们给一个短语查询设置了很高的额slop时,就像下面这样

POST product/_search
{
"query": {
"match_phrase": {
"name": {
"query": " 上海 自由行",
"slop" : 100
}
}
}
}
//但是虽然我们给了很高的slop值,我们可以根据返回的score分数值来进行判断几个字段是否更加的临近。
部分匹配
  • prefix 前缀查询

    前缀查询,就是将一个词从头开始查。 例如某个数据是上海一日游 可利用前缀查询查询 上海

      POST /product/_search
    {
    "query": {
    "prefix": {
    "departureCitys": {
    "value": "上"
    }

    }
    }

prefix 前缀查询,不会在搜索的时候分析字符串,它假定传入的字符串就是正要查询的前缀

**默认状态下, prefix 查询不做相关度评分计算,它只是将所有匹配的文档返回,并为每条结果赋予评分值 1 **

  • 前缀搜索的步骤

    1. 扫描词列表,并查找第一个关键词
    2. 收集关联的文档id
    3. 移动到下一个词。
    4. 如果这个词也是以 关键字开头,查询跳回到第二步再重复执行,直到下一个词不以关键字 为止。
Elasticsearch - 理解字段分析过程(_analyze与_explain)
  • _explain 用来帮助分析文档的relevance score是如何计算出来

    1. GET /product/_analyze?text="自由行", 使用默认的额analyze来分析自由行
    2. 指定的analyzer来分析 例如 GET /product/_analyze ?analyzer=pinyin_analyzer&text=" 自由行"
    3. 指定field的analyzer来分析 GET /product/_analyze?field=base.name&text=" 自由行"
  • _analyze用来分析每一个field或者某个analyzer/tokenizer是如何分析和索引一段文字

    1. 使用_explain向ElasticSearch询问庆于该文档是如何匹配(或者没有匹配上)的解释信息
      	POST /product/_search
    {
    "explain": true,
    "size": 1,
    "query": {
    "match": {
    "name": "三亚"
    }
    }
    }
查询时输入即搜索

match_phrase_prefix 查询, 短语查询和前缀查询的组合

GET /product/_search
{
"query": {
"match_phrase_prefix": {
"name": {
"query": "上 海",
"slop" : 20,
"max_expansions": 50
}
}
}
}

slop 来使整个词序位置不是那么的严格

参数 max_expansions 控制着可以与前缀匹配的词的数量

Elasticsearch进行search查询的过程中,出现了Result window is too large错误
- ES默认窗口10000。可以用修改index.max_result_window参数来解决问题
- curl -XPUT http://127.0.0.1:9200/product/_settings -d '{ "index" : { "max_result_window" : 100000}}'

ElasticSearch 学习记录之ES短语匹配基本用法的更多相关文章

  1. ElasticSearch 学习记录之ES几种常见的聚合操作

    ES几种常见的聚合操作 普通聚合 POST /product/_search { "size": 0, "aggs": { "agg_city&quo ...

  2. ElasticSearch 学习记录之ES高亮搜索

    高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...

  3. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询

    ES添加排序 在默认的情况下,ES 是根据文档的得分score来进行文档额排序的.但是自己可以根据自己的针对一些字段进行排序.就像下面的查询脚本一样.下面的这个查询是根据productid这个值进行排 ...

  4. ElasticSearch 学习记录之ES如何操作Lucene段

    近实时搜索 提交(Commiting)一个新的段到磁盘需要一个 fsync 来确保段被物理性地写入磁盘,这样在断电的时候就不会丢失数据.但是每次提交的一个新的段都fsync 这样操作代价过大.可以使用 ...

  5. ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理

    分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...

  6. ElasticSearch 学习记录之如任何设计可扩容的索引结构

    扩容设计 扩容的单元 一个分片即一个 Lucene 索引 ,一个 Elasticsearch 索引即一系列分片的集合 一个分片即为 扩容的单元 . 一个最小的索引拥有一个分片. 一个只有一个分片的索引 ...

  7. ElasticSearch 学习记录之父子结构的查询

    父子结构 父亲type属性查询子type 的类型 父子结构的查询,可以通过父亲类型的字段,查询出子类型的索引信息 POST /product/_search { "query": ...

  8. ElasticSearch 学习记录之Text keyword 两种基本类型区别

    ElasticSearch 系列文章 1 ES 入门之一 安装ElasticSearcha 2 ES 记录之如何创建一个索引映射 3 ElasticSearch 学习记录之Text keyword 两 ...

  9. Elasticsearch学习记录(入门篇)

    Elasticsearch学习记录(入门篇) 1. Elasticsearch的请求与结果 请求结构 curl -X<VERB> '<PROTOCOL>://<HOST& ...

随机推荐

  1. Problem V

    Problem Description The aspiring Roy the Robber has seen a lot of American movies, and knows that th ...

  2. java中的缓冲流BufferedWriter和BufferedReader

    java中的缓冲流有BufferedWriter和BufferedReader 在java api 手册中这样说缓冲流: 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取.可以指 ...

  3. 搭建Maven私服那点事

    摘要:本文主要介绍在CentOS7.1下使用nexus3.6.0搭建maven私服,以及maven私服的使用(将自己的Maven项目指定到私服地址.将第三方项目jar上传到私服供其他项目组使用) 一. ...

  4. ajax请求发送和页面跳转的冲突

    http://blog.csdn.net/allenliu6/article/details/77341538?locationNum=7&fps=1 在A页面中,有一个click事件,点击时 ...

  5. Lucene全文检索学习笔记

    全文索引 介绍Lucene的作者:Lucene的贡献者Doug Cutting是 一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后 ...

  6. 一起写框架-MVC框架-基础功能-Date类型数据绑定(七)

    实现功能 表单请求传递的数据,格式为以下格式的日期时间数据. (1):yyyy-MM-dd hh:mm:ss (2):yyyy-MM-dd 执行方法可以使用Date类型接收. 实现思路 1.获得表单字 ...

  7. 《天书夜读:从汇编语言到windows内核编程》二 C语言的流程与处理

    1) Debug与Release的区别:前者称调试版,后者称发行版.调试版基本不优化,而发行版会经过编译器的极致优化,往往与优化前的高级语言执行流程会大相径庭,但是实现的功能是等价的. 2) 如下fo ...

  8. MyBatis 一、二级缓存和自定义缓存

    1.一级缓存 ​ MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的.即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一 ...

  9. 使用Supervisor守护Python进程

    1.需求 现在有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,就需要使用到了Supervisor.Supervisor起到守护 ...

  10. Python之numpy模块array简短学习

    1.简介 Python的lists是非常的灵活以及易于使用.但是在处理科学计算相关大数量的时候,有点显得捉襟见肘了. Numpy提供一个强大的N维数组对象(ndarray),包含一些列同类型的元素,这 ...