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. Shape of HDU

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. 【Aladdin Unity3D Shader编程】之一 基本入门

    OpenGL.DirectX以及GLSL.HLSL.CG OpenGL和DirectX是图像应用编程接口,用于渲染二维或者三维图形. GLSL着色语言是用来在OpenGL中着色编程的语言,有点在于跨平 ...

  3. Java多线程synchronized关键字

    synchronized关键字代表着同步的意思,在Java中被synchronized修饰的有三种情况 1.同步代码块 //锁为objsynchronized(obj){ while(true){ i ...

  4. JDBC连接数据库的几种方法

    一. 最古老的方法(通过 Driver 接口直接连接数据库) 首先创建一个 Driver 实现类的对象 Driver dirver = new com.mysql.jdbc.Driver(); 准备连 ...

  5. python3 xpath数据获取案例

    import requestsfrom retrying import retryfrom lxml import etreeimport json class DaCheng(object): de ...

  6. spring @Autowired和jdk的@Resource区别

    当一个接口只有一个实例时,使用这两个注解的效果是一样的. 当含有两个实例时,非得使用 @Autowired 那么定义的引用类型必须和service实现类定义的名字相同,参照下图 定义第一个servic ...

  7. 比特币区块结构Merkle树及简单支付验证分析

    在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...

  8. Spring的69个知识点

    目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...

  9. 深入理解ES6之——迭代器与生成器

    迭代器 迭代器是被设计专用于迭代的对象,带有特定接口.所有的迭代器对象都有next方法,会返回一个结果对象.该结果对象有两个属性:对应下一个值的value,以及一个布尔类型的done,其值为true时 ...

  10. Next week plan

    1.get a job 2.write a high performance chatroom with encryption.  Use scala. Next Week turn to Rust