请教大家一个问题,我现在有一个关键词 ck 牛仔裤 ,用了cross_field类型做搜索,具体语句如下:
搜索结果前面出现的结果是很匹配的,但是 后面出现的结果都是命中某一个字段后出现的结果,相对来说很不准,所以想请教一下,如何精确拿到自己想要的数据,es有好的建议吗
{
"query": {
"bool": {
"must": {
"multi_match": {
"fields": [
"name^3",
"category_name^2",
"brand_name^2",
"brand_alias_name",
"sex",
"attribute",
"long_desc",
"condition_desc",
"brand_name_cn",
"name.synonym",
"brand_name.synonym",
"name.ikmax",
"name.sy_ikmax",
"brand_name_cn.synonym",
"brand_alias_name.synonym",
"attribute.synonym",
"long_desc.synonym",
"condition_desc.synonym",
"category_name.synonym"
],
"operator": "AND",
"query": "ck 牛仔裤",
"tie_breaker": 0.3,
"type": "cross_fields"
}
}
}
}
}
搜索结果前面出现的结果是很匹配的,但是 后面出现的结果都是命中某一个字段后出现的结果,相对来说很不准,所以想请教一下,如何精确拿到自己想要的数据,es有好的建议吗
9 个回复
core_wzw - 某AILab搜索技术负责人
赞同来自: wengxuejie
但说实话,一般ES拿来做全文搜索都不会要求是精确的,比如搜索【耐克 阿迪达斯 上衣】,如果使用operator为AND,则无论使用哪种multi_search type都无法匹配出商品,所以往往用multi_match都是设置operator为OR(默认就为OR),并且设置minimum_should_match为60%,这样就可以搜索出属于耐克和阿迪达斯的上衣了,这种情况相当于一种泛搜索,扩大召回集嘛,至于什么样的文档应该出现在Top100,只需要多写一些打分特征让相关度更高的文档排在前面即可。相关度一般的文档被排在10000th的位置,或者没被召回,谁在乎呢。:)
rochy - rochy_he
赞同来自:
去掉 "tie_breaker": 0.3,
type 换为 phrase
看一下效果;
如果觉得可以,你可以使用 disMaxQuery 将
multiMatchQuery type = phrase 与 multiMatchQuery 两种结合起来;这样即能保证准确度也能保证一定的查全率
wengxuejie
赞同来自:
rochy - rochy_he
赞同来自:
"operator": "AND",
"query": "ck 牛仔裤",
"tie_breaker": 0.3,
"type": "best_fields"
wengxuejie
赞同来自:
core_wzw - 某AILab搜索技术负责人
赞同来自:
2.再惯例问下,用cross_fields的前提,这么多字段在mapping建索引的分词器都一样吗?大部分人用cross_fields的目的都是要以各字段的mapping一致才行,如果是则在cross_fields的基础上咱们继续说。
3.“但是 后面出现的结果都是命中某一个字段后出现的结果,相对来说很不准”,既然这个打分特征用了multi_match,operator=and,那么不管type是cross_fields还是best_fields、most_fields,意思都是只要19个字段里,只要有一个字段同时包含“ck”“牛仔裤”,那么这篇文档就会被召回,也就会出现召回集靠后的文档出现了仅有某个字段包含“ck”“牛仔裤”都能被召回,产生楼主说的体验感差,哪怕文档得分很低。
core_wzw - 某AILab搜索技术负责人
赞同来自:
wengxuejie
赞同来自:
代码如下:
这是一种很精确的查询方式,如果想扩大曝光,可以做截断的方式来处理
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自:
1、default_operator 参数设置为:true, 走短语匹配的方式;
2、auto_generate_phrase_queries 参数设置为 true,走短语匹配。
以上2个参数能满足短语匹配的要求,可以进一步试试。