2-2、深入搜索 -基于词项和基于全文的搜索
1. 基于词项和基于全文的搜索
-
基于 Term 的查询
Term 是表达语意的最⼩单位。搜索和利⽤统计语⾔模型进⾏⾃然语⾔处理都需要处理 Term
-
特点
- Term Level Query: Term Query / Range Query / Exists Query / Prefix Query /Wildcard Query
- 在 ES 中,Term 查询,对输⼊不做分词。会将输⼊作为⼀个整体,在倒排索引中查找准确的词项,并
且使⽤相关度算分公式为每个包含该词项的⽂档进⾏相关度算分 – 例如“Apple Store” - 可以通过 Constant Score 将查询转换成⼀个 Filtering,避免算分,并利⽤缓存,提⾼性能
-
例子
创建index products_test
关于Term 查询的例子
POST /products_test/product/_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_test/_search
{
"query": {
"term": {
"desc.keyword": {
//"value": "iPhone" 查不到结果
//"value":"iphone" 可以查到
}
}
}
}
上面查询分别返回什么?
term 查询 字段不分词 ,可以再mapping 中设置 keyword
- 复合查询 Constant Score 转为 Filter
- 将 Query 转成 Filter,忽略 TF-IDF 计算,避免相关性算分的开销
- Filter 可以有效利⽤缓存
POST /products_test/_search
{
//"explain": true,
"query": {
"constant_score": { // 忽视计算分数带来的性能影响
"filter": {
"term": {
"productID.keyword": "XHDK-A-1293-#fJ3"
}
}
}
}
}
基于全文的查询
- 基于全⽂本的查找
- Match Query / Match Phrase Query / Query String Query
- 特点
- 索引和搜索时都会进⾏分词,查询字符串先传递到⼀个合适的分词器,然后⽣成⼀个供查询的词
项列表 - 查询时候,先会对输⼊的查询进⾏分词,然后每个词项逐个进⾏底层的查询,最终将结果进⾏合
并。并为每个⽂档⽣成⼀个算分。- 例如查 “Matrix reloaded”,会查到包括 Matrix 或者 reload
的所有结果。
- 索引和搜索时都会进⾏分词,查询字符串先传递到⼀个合适的分词器,然后⽣成⼀个供查询的词
post product_test/_search
{
"query":{
"match":{
"desc":{
"query":"dejxv"
}
}
}
}
match 与 match_phrase 区别?