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

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之 控制相关度原理讲解







短语匹配

短语匹配故名思意就是对分词后的短语就是匹配,而不是仅仅对单独的单词进行匹配
下面就是根据下面的脚本例子来看整个短语匹配的有哪些做用和优势html

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"
      }
    }
  }
}

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

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

对 短语查询进行一些优化
经过加入slop参数,能够灵活的控制短语查询的,
slop 参数告诉 match_phrase 查询词条相隔多远时仍然能将文档视为匹配elasticsearch

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询问庆于该文档是如何匹配(或者没有匹配上)的解释信息
    2. 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 控制着能够与前缀匹配的词的数量ui

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}}'