目录

基于Term查询

基本概念

Demo

复合查询 -Constant Score 转为Filter

基于全文查询

基本介绍

Match Query 查询过程

本节知识回顾


基于Term查询

基本概念

  • Term的重要性
  • Term是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要Term
  • 特点
  • Term Level Query: Term Query / Range Query / Exists Query / Prefix Query /Wildcard Query
  • 在ES中,Term查询,对输入不做分词.会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分 --例如 "Apple Store"
  • 可以通过Constant Score将查询转换成一个Filtering,避免算分并利用缓存,提高性能

Demo

POST /products/_bulk
 {"index":{"_id":1}}
 {"productID":"XHDK-A-1293-#fJ3","desc":"iPhone"}
 {"index":{"_id":2}}
 {"productID":"KDKE-B-9947-#kL5","desc":"iPad"}
 {"index":{"_id":3}}
 {"productID":"JODL-X-1937-#pV7","desc":"MBP"}

es哪种suggest最好 es的term_搜索

POST /products/_search
 {
   "query": {
     "term": {
       "desc": {        //注解此时iphone均为小写
         "value": "iphone"
       }
     }
   }
 }


上面的查询可以匹配到对应的数据

es哪种suggest最好 es的term_字段_02

es哪种suggest最好 es的term_elasticsearch_03

es哪种suggest最好 es的term_搜索_04

  •  当然,如果建立索引时,指定productID的类型为keyword,term查询字段不必是xxx.keyword也是可以全部匹配的mapping相关的的知识可以点击这里查看
PUT /products
 {
   "mappings": {
     "properties": {
       "productID":{
         "type": "keyword"
       },
       "desc":{
         "type": "text"
       }
     }
   }
 }

复合查询 -Constant Score 转为Filter

  • 将Query转为Filter,忽略TF-IDF计算,避免相关性算分的开销
  • Filter可以有效利用缓存
POST /products/_search
 {
   "explain": true, 
   "query": {
     "constant_score": {
       "filter": {
         "term": {
           "productID.keyword": "xhdk"
         }
       }
     }
   }
 }

es哪种suggest最好 es的term_es哪种suggest最好_05

基于全文查询

基本介绍

  • 基于全文本的查询
  • Match Query / Match phrase Query / Query String Query这部分知识可以点击这里查看
  • 特定
  • 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表
  • 查询的时候,会先对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并,并为每个文档生成一个算分. 例如查"Matrix reloaded",会先查到Matrix或者reload的所有结果

Match Query 查询过程

es哪种suggest最好 es的term_字符串_06

  • 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表
  • 查询的时候,会先对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并,并为每个文档生成一个算分.

本节知识回顾

  • 基于词项的查找VS基于全文的查找
  • 通过字段Mapping控制字段的分词(精确的匹配查询,在Mapping中将字段设为Keyword(不会做分词处理))
  • "Text" VS "Keyword"
  • 通过参数控制查询的Precision&&Recall
  • 复合查询 --Constant Score查询
  • 即便是对Keyword进行Term查询,同样会进行算分
  • 可以将查询转为Filter,取消相关性算分的环节,以提升性能