一:基于词项和基于全文的搜索
1.1 基于Term的查询
Term 是表达语意的最小单位。搜索和利用统计语言模型进行自然语言处理都需要处理Term。
特点
- Term Query/ Range Query/ Exists Query/Prefix Query/Wildcard Query
- 在ES中,Term查询,对输入不做分词。会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分
- 可以通过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": {
//"value": "iPhone" # 搜索不到 因为在存入数据的时候默认会进行分词 将大写变成小写,而term查询对输入不分词 因此搜索不到
"value":"iphone" # 搜索得到
}
}
}
}
POST /products/_search
{
"query": {
"term": {
"desc.keyword": {
//"value": "iPhone" # 搜索得到
//"value":"iphone" # 搜索不到。keyword 存储的是不分词之前的原值
}
}
}
}
1.1.2 复合查询
将Query转成Filter,忽略TF-IDF计算,避免相关性算分的开销
Filter 可以有效的利用缓存
Demo
POST /products/_search
{
"explain": true, # 查看算分过程
"query": {
"term": {
"productID.keyword": {
"value": "KDKE-B-9947-#kL5"
}
}
}
}
POST /products/_search
{
"explain":true, # 查看算分过程
"query":{
"constant_score":{
"filter":{
"term":{
"productID.keyword":"KDKE-B-9947-#kL5"