elasticsearch控制查询精准度

1、使用minimum_should_match参数

elasticsearch query中的minimum_should_match ,字面意思就很清晰了,就是最小匹配度,但是它却有很多种配置方式。
正向匹配度比如 "minimum_should_match":3 官方原文解释是:Indicates a fixed value regardless of the number of optional clauses.
这里要说明一下为什么是optional clauses(翻译为可选的子句),因为对于被analyzer分解出来的每一个term都会构造成一个should的bool query的查询,每个term变成一个term query子句。
例如"query": "how not to be",被解析成:
{
  "bool": {
    "should": [
      { "term": { "body": "how"}},
      { "term": { "body": "not"}},
      { "term": { "body": "to"}},
      { "term": { "body": "be"}}
    ],
    "minimum_should_match": 3
  }
}
(注:在bool query中minimum_should_match只能紧跟在should的后面,放其他地方会出异常)

或者 "minimum_should_match":75%,可以配置一个一个百分比,至少optional clauses至少满足75%,这里是向下取整的。
比如有5个clause,5*75%=3.75,向下取整为3,也就是至少需要match 3个clause。

逆向匹配和正向匹配相反,比如我们可以近似理解为-25%和75%表示的是一个意思,但是有些小小的差异,比如有5个clause,逆向匹配-25%,5*25%=1.25,取整是1,5-1=4,即要匹配4个clause,而75%算出来是3个clause。

例如:

term(job,“”销售经理“”)结果可能会出现:员或者是4S店经理/维修站经理等

如果使用:QueryBuilders.matchQuery(job,“”销售经理“”).minimumShouldMatch("90%")  则不会出现。

因为销售经理经过分词会出现:

{
tokens: [
{
token: "销售",
start_offset: 0,
end_offset: 2,
type: "CN_WORD",
position: 0
},
{
token: "销",
start_offset: 0,
end_offset: 1,
type: "CN_WORD",
position: 1
},
{
token: "售",
start_offset: 1,
end_offset: 2,
type: "CN_WORD",
position: 2
},
{
token: "经理",
start_offset: 2,
end_offset: 4,
type: "CN_WORD",
position: 3
}
]
}
配置了匹配度最少为90% 意味着召回的doc中至少有 4*0.9=3.6向下取整3个词条才可以。

2、使用短语查询

QueryBuilders.matchPhraseQuery(field, value).slop(2)

表示将value分词后中间允许存在两个分词结果的词条;如原句子是:

我是你们公司部门的经理

经过分词后:

{
tokens: [
{
token: "我",
start_offset: 0,
end_offset: 1,
type: "CN_CHAR",
position: 0
},
{
token: "你们",
start_offset: 2,
end_offset: 4,
type: "CN_WORD",
position: 1
},
{
token: "公司",
start_offset: 4,
end_offset: 6,
type: "CN_WORD",
position: 2
},
{
token: "部门",
start_offset: 6,
end_offset: 8,
type: "CN_WORD",
position: 3
},
{
token: "经理",
start_offset: 9,
end_offset: 11,
type: "CN_WORD",
position: 4
}
]
}
QueryBuilders.matchPhraseQuery(field, "我是经理").slop(2)

那么查不到,因为‘我是经理’分词后是我   经理;在这两个中间最多允许2个分词的词条。但是我是你们‘’我是你们公司部门的经理"在我   经理中间有3个词条,索引搜索不到。
QueryBuilders.matchPhraseQuery(field, "我是经理").slop(3)或者大于3也可以。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值