目录
基于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"}
POST /products/_search
{
"query": {
"term": {
"desc": { //注解此时iphone均为小写
"value": "iphone"
}
}
}
}
上面的查询可以匹配到对应的数据
- 当然,如果建立索引时,指定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"
}
}
}
}
}
基于全文查询
基本介绍
- 基于全文本的查询
- Match Query / Match phrase Query / Query String Query这部分知识可以点击这里查看
- 特定
- 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表
- 查询的时候,会先对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并,并为每个文档生成一个算分. 例如查"Matrix reloaded",会先查到Matrix或者reload的所有结果
Match Query 查询过程
- 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词器,然后生成一个供查询的词项列表
- 查询的时候,会先对输入的查询进行分词,然后每个词项逐个进行底层的查询,最终将结果进行合并,并为每个文档生成一个算分.
本节知识回顾
- 基于词项的查找VS基于全文的查找
- 通过字段Mapping控制字段的分词(精确的匹配查询,在Mapping中将字段设为Keyword(不会做分词处理))
- "Text" VS "Keyword"
- 通过参数控制查询的Precision&&Recall
- 复合查询 --Constant Score查询
- 即便是对Keyword进行Term查询,同样会进行算分
- 可以将查询转为Filter,取消相关性算分的环节,以提升性能