Elasticsearch专利检索:设置关键词优先级及解决查询报错
修改后查询报错的排查结论
直接列你写的DSL里的几个硬伤,改完就能解决解析报错:
match查询结构错误:你当前的写法{"match": {"title": "AMBRA1", "boost": 2}}不符合ES语法,boost是match查询的配置项,不是字段的属性,正确结构需要把查询词和权重都放在字段对应的配置对象里,否则ES解析时会把boost当成title字段的待查询内容,直接抛格式错误。- 存在无效空查询:你在
should块里加了三个查询值为空字符串的match条件,ES默认不允许空字符串的全文检索请求,这部分属于无意义冗余内容,会直接触发解析报错。 - 参数值非法:
range查询里的lte传了Python风格的空值None,ES无法识别该值,不需要上界限制直接删掉lte配置即可,不要传空值占位。 - 存在冗余空逻辑块:
must数组里第一个子查询是should为空的bool查询,没有任何检索逻辑,虽然不一定直接报错,但会干扰评分计算,直接删掉即可。 - 顶层参数不合法:
language: 'EN'、stemming: 'true'不是Elasticsearch原生DSL的顶层参数,原生ES的词干提取、语言适配是在索引字段的分析器层面提前配置的,不需要查询时传参;如果你用的是第三方封装的专利检索接口,需要单独确认这两个自定义参数的传参位置,不要直接放在ES查询结构里。
text类型字段配置关键词优先级的正确方案
text类型字段完全支持关键词权重配置,不需要用terms查询——terms是做精确枚举值匹配的,不适合text字段的分词检索场景,直接用boost参数配合全文检索类查询即可实现优先级区分,规则如下:
- 同字段不同关键词权重:比如权利要求(
claim)字段里的核心关键词、次要关键词,直接给对应match查询设置不同boost值即可,权重越高,匹配到该关键词的文档得分越高,排序越靠前,一般按照3:1的比例区分核心/次要关键词就足够。 - 跨字段同关键词权重:如果要让同一个关键词在标题、摘要、权利要求里的权重不同(比如标题匹配优先级最高),可以给不同字段的
match查询单独设权重,也可以用multi_match统一配置,写法更简洁。 - bool查询逻辑适配:必须满足的检索条件放在
must块里,非必须但匹配到可以提权的条件放在should块里——should块的条件不匹配不会过滤文档,匹配到会额外加分,非常适合配置高优先级的提权规则。
修正后的参考查询示例
{ "query": { "bool": { "must": [ { "bool": { "should": [ // 权利要求字段核心关键词,权重3 {"match": {"claim": {"query": "核心检索关键词", "boost": 3}}}, // 权利要求字段次要关键词,权重1 {"match": {"claim": {"query": "次要检索关键词", "boost": 1}}} ] } }, { "range": { "date_published": { "gte": "2019-01-01" } } } ], "should": [ // AMBRA1跨字段提权,标题匹配权重最高 {"match": {"title": {"query": "AMBRA1", "boost": 3}}}, {"match": {"abstract": {"query": "AMBRA1", "boost": 2}}}, {"match": {"claim": {"query": "AMBRA1", "boost": 2}}} ], "filter": [ {"exists": {"field": "title"}} ] } }, "size": 10, "from": 0 }
注意:权重值不需要设置得过大,按照优先级比例配置即可,过高的权重值会导致评分逻辑失衡,反而影响排序结果。如果需要检索AMBRA1这类专有名词,可以给对应字段配置保留专有名词的分析器,避免分词错误导致漏检。
内容的提问来源于stack exchange,提问作者Travasaurus
相关产品推荐
相关产品推荐

