一、搜索关键字分词效果
示例:查询名称包含手机的记录
GET /sku/_search
{
"query": {
"match": {
"name": "手机"
}
}
}
结果结果如下:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 0.44183272,
"hits" : [
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "Ompe7HEBQIJxGG8U13yY",
"_score" : 0.44183272,
"_source" : {
"name" : "小米手机",
"price" : 200000,
"spuId" : 101,
"createTime" : "2020-05-09",
"brandName" : "小米",
"categoryName" : "手机",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "移动4g",
"屏幕尺寸" : "4.5"
}
}
},
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "3",
"_score" : 0.44183272,
"_source" : {
"name" : "苹果手机",
"price" : 100000,
"spuId" : 10112,
"createTime" : "2020-05-01",
"brandName" : "苹果",
"categoryName" : "手机",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "全网",
"屏幕尺寸" : "56"
}
}
},
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "4",
"_score" : 0.44183272,
"_source" : {
"name" : "vivo手机",
"price" : 200000,
"spuId" : 10118,
"createTime" : "2020-05-01",
"brandName" : "vivo",
"categoryName" : "手机",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "全网",
"屏幕尺寸" : "56"
}
}
},
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "gAWw_nEBqh6AXa2lyxIz",
"_score" : 0.44183272,
"_source" : {
"name" : "三星手机",
"price" : 200000,
"spuId" : 104,
"createTime" : "2020-05-09",
"brandName" : "三星",
"categoryName" : "手机",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "移动4g",
"屏幕尺寸" : "4.5"
}
}
}
]
}
}
如果我们查询“小米电视”会有几条记录被查询出来呢?你可以能说会有一条,但我们测试一下会看到结果为:小米电视、小米手机、三星电视三条结果,这是为什么呢?这是因为在查询时,会先搜索关键字进行分词,对分词后的字符串进行查询(分成小米、电视两个词),只要是包含这些字符串的都是要被查询出来的,多个词之间是or的关系。
但注意,查询结果的匹配分值_score 是不一样的,分值高的排在前面。
搜索:小米电视
GET /sku/_search
{
"query": {
"match": {
"name": "小米电视"
}
}
}
查询结果:
{
"took" : 6,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 2.059239,
"hits" : [
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "2",
"_score" : 2.059239,
"_source" : {
"name" : "小米电视",
"price" : 100000,
"spuId" : 10111,
"createTime" : "2020-05-01",
"brandName" : "小米",
"categoryName" : "电视",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "全网",
"屏幕尺寸" : "56"
}
}
},
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "Ompe7HEBQIJxGG8U13yY",
"_score" : 1.0296195,
"_source" : {
"name" : "小米手机",
"price" : 200000,
"spuId" : 101,
"createTime" : "2020-05-09",
"brandName" : "小米",
"categoryName" : "手机",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "移动4g",
"屏幕尺寸" : "4.5"
}
}
},
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0296195,
"_source" : {
"name" : "三星电视",
"price" : 100000,
"spuId" : 10111,
"createTime" : "2020-05-01",
"brandName" : "三星",
"categoryName" : "电视",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "全网",
"屏幕尺寸" : "56"
}
}
}
]
}
}
如果我们想要进行精确查询,想要的是查询“小米电视”这一条记录,怎么办呢?我们可以这样写:
GET /sku/_search
{
"query": {
"match": {
"name": {
"query": "小米电视",
"operator": "and"
}
}
}
}
查询结果只有小米电视一条记录了:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.059239,
"hits" : [
{
"_index" : "sku",
"_type" : "_doc",
"_id" : "2",
"_score" : 2.059239,
"_source" : {
"name" : "小米电视",
"price" : 100000,
"spuId" : 10111,
"createTime" : "2020-05-01",
"brandName" : "小米",
"categoryName" : "电视",
"saleNum" : 10012,
"commentNum" : 323,
"spec" : {
"网络制式" : "全网",
"屏幕尺寸" : "56"
}
}
}
]
}
}
operator 指定为and,不指定时默认为or。
二、Java关键代码
SearchRequest request = new SearchRequest(index);
MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery(pageSearchVO.getField(), keyword);
//精确查询(关键字不分词查询)
queryBuilder.operator(Operator.AND);
builder.query(queryBuilder);
request.source(builder);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
网友评论