Term查询和全文查询

本文详细介绍了Elasticsearch中的Term查询,强调了Term查询不会对输入数据进行分词处理,以及如何通过desc.keyword来正确执行Term查询。同时,文章也探讨了全文搜索的特点,包括Match和Match Phrase查询,指出它们在索引和搜索时的分词处理过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Term查询

对输入条件作为一个整体,不做分词,在倒排索引中找到准确的词项,并算分
Term Level Query:Term Query/Range Query/Exsits Query/Prefix Query /Wilcard Qery
可以通过Constant Score将查询转换成一个Filtering,避免TF-DF算分,并利用缓存,提升性能

DELETE products
PUT products
{
  "settings": {
    "number_of_shards": 1
  }
}


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" }

GET /products

es存储text数据是对desc进行了分词处理,最后转了小写存储的,而term查询不会对输入数据做分词处理,所以无结果返回。

#案例1-此处不会有返回
POST /products/_search
{
“query”: {
“term”: {
“desc”: {
“value”: “iPhone”
}
}
}
}
#此处正常返回
POST /products/_search
{
“query”: {
“term”: {
“desc”: {
“value”:“iphone”
}
}
}
}

desc.keyword

es在对text文本存储时会进行分词处理,但会为每个字段保留一个keyword属性
#正常返回
POST /products/_search
{
“query”: {
“term”: {
“desc.keyword”: {
“value”: “iPhone”
}
}
}
}
#无数据
POST /products/_search
{
“query”: {
“term”: {
“desc.keyword”: {
“value”:“iphone”
}
}
}
}
#存储分词处理,term搜索不处理,无返回

POST /products/_search
{
“query”: {
“term”: {
“productID”: {
“value”: “XHDK-A-1293-#fJ3”
}
}
}
}
#存储分词处理,但又keyword,term搜索不处理,正常返回

POST /products/_search
{
//“explain”: true,
“query”: {
“term”: {
“productID.keyword”: {
“value”: “XHDK-A-1293-#fJ3”
}
}
}
}

#Filter可以有效利用缓存
POST /products/_search
{
“explain”: true,
“query”: {
“constant_score”: {
“filter”: {
“term”: {
“productID.keyword”: “XHDK-A-1293-#fJ3”
}
}

}

}
}

二、 基于全文搜索

1.特点

  • Match Query/Match Phrase Query/Query String Query

  • 索引和搜索时都会进行分词,查询字符串先传递到一个合适的分词项列表,然后生成一个可供查询的词项列表

  • 查询时,先会对输入的数据进行分词。然后每个次项逐个进行底层查询。最终合并结果。并未每个文档生成一个算分-例如“A B”,会查到包括A或者B的所有结果

2、数据准备


DELETE groups
PUT groups
{
  "mappings": {
    "properties": {
      "names":{
        "type": "text",
      }
    }
  }
}

GET groups/_mapping

POST groups/_doc
{
  "names": [ "John Water", "Water Smith"]
}

POST groups/_doc
{
  "names": [ "Sam Water"]
}
POST groups/_doc
{
  "names": [ "Sam Has Water"]
}

3、match查询

#正常返回数据 查询所有包含Water的数据
POST groups/_search
{
  "query": {
    "match": {
      "names": {
        "query": "Water"
      }
    }
  }
}
#先分词为same和water,然后查出包含same或者water的数据
那么像整体查包含"Same Water"的数据咋办呢
POST groups/_search
{
  "query": {
    "match": {
      "names": {
        "query": "Sam Water"
      }
    }
  }
}
#查询出包含Same 和Water的数据,注意Sam Has Water也会返回
POST groups/_search
{
  "query": {
    "match": {
      "names": {
        "query": "Sam Water",
         "operator": "and"
      }
    }
  }
}

4、match_phrase查询

#match_phrase 会把Same Water作为整体进行查询

只返回包含"Sam Water"短语的数据
POST groups/_search
{
  "query": {
    "match_phrase": {
      "names": {
        "query": "Sam Water"
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值