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