ElasticSearch DSL 语法实践例子(二)

Jacob的咖啡屋2018-10-29 21:19:37

Best_field策略

Pre

  1. POST /forum/article/_bulk

  2. {"update":{"_id":1}}

  3. {"doc":{"content":"I like to write best elasticsearch article"}}

  4. {"update":{"_id":2}}

  5. {"doc":{"content":"I think java is best programming language"}}

  6. {"update":{"_id":3}}

  7. {"doc":{"content":"I like to write best elasticsearch article"}}

  8. {"update":{"_id":4}}

  9. {"doc":{"content":"I just an elasticsearch beginner"}}

best field 策略: 将某一个 field 匹配尽可能多的关键词的 doc 返回回来

dis_max: 直接取多个query中分数最高的那个score,而不是按照默认内置的分数计算而得。

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "dis_max": {

  5.      "queries": [

  6.        {

  7.          "match": {

  8.            "title": "java solution"

  9.          }

  10.        },

  11.        {

  12.          "match": {

  13.            "content": "java solution"

  14.          }

  15.        }

  16.      ]

  17.    }

  18.  }

  19. }

综合一下:

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "multi_match": {

  5.      "query": "java elasticsearch",

  6.      "type": "best_fields",

  7.      "fields": ["title^2", "content"],

  8.      "tie_breaker": 0.5

  9.    }

  10.  }

  11. }

Most field 策略

most field 策略: 优先返回尽可能多 field 匹配到关键词的 doc

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "multi_match": {

  5.      "query": "java elasticsearch",

  6.      "type": "most_fields",

  7.      "fields": ["title^2", "content"],

  8.      "tie_breaker": 0.5

  9.    }

  10.  }

  11. }

Cross-fields 搜索

Cross-Fields: 一个唯一标识,跨了多个字段,如name标识一个人,但是分成了 firstname 和 lastname 两个 field

所以宜采用most field 搜索

another solution 就是使用指定 multi_match 中的type为“cross-fields

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "multi_match": {

  5.      "query": "Jack Ma",

  6.      "type": "cross_fields",

  7.      "fields": ["author_first_name", "author_last_name"],

  8.      "operator":"and"

  9.    }

  10.  }

  11. }

Match_phrase

短语搜索,必须完全匹配

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "match_phrase": {

  5.      "content": "java is "

  6.    }

  7.  }

  8. }

Match_phrase.slop

移动几次才能匹配一个doc, 比如给定 java language 要匹配到I think java is best programming language,此时 slop 为3. 即 language 单词需要往后移动3个单位。

  1. GET /forum/article/_search

  2. {

  3.  "query": {

  4.    "match_phrase": {

  5.      "content": {

  6.        "query": "java language",

  7.        "slop":3

  8.      }

  9.    }

  10.  }

  11. }

Rescore

match + proximity match 同时实现召回率和精准度。

默认情况下,match 也许匹配了 1000 个 doc, proximity match 区都需要对每个 doc 进行一遍运算,判断能否 slop 移动匹配上,然后去贡献自己等数。但是很多情况下,match 出来也许 1000 个 doc, 其实用户大部分情况下是分页查询的,所以可能最多只会看前面几页,比如一页是10行,最多也就看5页,就是50条,proximity match 只要对前面50个doc进行 slop 移动去匹配,去贡献自己的分数即可,不需要对全部 1000 个 doc 进行计算和

  1. GET /forum/article/_search

  2. {

  3. "query": {

  4.   "match": {

  5.     "content": "java programming"

  6.   }

  7. },

  8. "rescore":{

  9.   "window_size":50,

  10.   "query":{

  11.     "rescore_query":{

  12.       "match_phrase":{

  13.         "content":{

  14.           "query":"java programming",

  15.           "slop":50

  16.         }

  17.       }

  18.     }

  19.   }

  20. }

  21. }

Index-Time搜索推荐

edge ngram: 将每一个单词进一步切分,用切分后的 ngram来实现前缀搜索推荐功能

  1. quick-->

  2. q

  3. qu

  4. qui

  5. quic

  6. quick

建立 索引时

  1. PUT /my_index

  2. {

  3.  "settings": {

  4.    "analysis": {

  5.      "filter": {

  6.        "autocomplete_filter":{

  7.          "type": "edge_ngram",

  8.          "min_gram":1,

  9.          "max_gram":20

  10.        }

  11.      },

  12.      "analyzer": {

  13.        "autocomplete":{

  14.          "type": "custom",

  15.          "tokenizer":"standard",

  16.          "filter":[

  17.            "lowercase",

  18.            "autocomplete_filter"

  19.          ]

  20.        }

  21.      }

  22.    }

  23.  }

  24. }

Analyzer-Test

  1. GET my_index/_analyze

  2. {

  3.  "analyzer": "autocomplete",

  4.  "text":"hello world"

  5. }

Create Mapping

  1. PUT /my_index/_mapping/my_type

  2. {

  3.  "properties": {

  4.    "title":{

  5.      "type": "text",

  6.      "analyzer": "autocomplete",

  7.      "search_analyzer": "standard"

  8.    }

  9.  }

  10. }

入库

  1. POST /my_index/my_type/_bulk

  2. {"index":{}}

  3. {"title":"hello win"}

  4. {"index":{}}

  5. {"title":"hello we"}

  6. {"index":{}}

  7. {"title":"hello dog"}

  8. {"index":{}}

  9. {"title":

Copyright © 温县电话机虚拟社区@2017