solr 控制多词联合查询命中的数量

本文探讨了全文检索中的查准率和召全率概念,解释了如何通过调整Solr配置及使用edismax查询来优化检索结果的数量和质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.本文涉及全文检索中那两个概念?

2.众多结果中,排序的标准是什么?

3.如何合理的控制solr查询的命中的数量和质量?

在一些日常的文章中或一些信息中,都有一些高频词,而这些高频词,在参与查询时,往往会造成,大量的结果集命中。
什么意思呢? 举个例子,假如我们现在做的是饭店的搜索,在我们的索引库里有一列name这个field,这里面大部分都是xxx饭店,假如你搜索的时候搜一个xxx饭店,会被分词成:
xxx
饭店
然后xxx命中只有10条结果集, 而饭店确命中了20万结果集,这么以来总结果可能就有20多万条,造成了大量的数据命中,一方面显示了信息的丰富性,另一方面可能给用户造成太多的困惑。

我们分析下在全文检索中两个重要的概念
查准率召全率
在Lucene,Solr和ElasticSearch里面一般的分词的查询结果都会对这两个率做一个最好效果的调配,而这个默认的相关性评分规则就是:
  • 相关性评分最高的排在前面,也就是查准的体现
  • 相关性低的排在后面,也就是查全的体现

当然上面的结论,并不是百分百正确的,因为由于Lucene底层的设计,可能会导致一些奇怪的效果,就是最精确的没有排在最前面,这种问题大概只有10%的概率,我们可以索引两个字段,来避免这种问题,一个分词,一个不分词,查询时候,可以一起查询两个字段.
回到刚才饭店的那个问题,假如现在有想要搜索一个:
北京车道沟北里小庄十里香饭店,分词后的情况如下:
车道

北里
小庄
十里

饭店
注意,在整个索引库里面大部分要搜索的数据都含有北京和饭店两个词,所以这一下几乎会索引里面的所有数据都查询出来了,虽然查询排名还可以,但命中量太大了,超过4页之后几乎都是北京xxxx饭店了,跟主题的搜索没啥关系,所以我们可以采取一些策略来避免这种情况:
solr默认的搜索策略,是分词后的term的or的关系,最后结果集全部返回,如果我们改成and,那就是精确匹配了,但是有一点就是,如果是精确的匹配,某些时候用户输入的不完整的词就失去了全文检索的含义了,所以我们要采取一种综合的策略,既保证查准,又能保证召回,这样才能实现?
这个东西直接用我们的全文检索框架是没法实现的,有个思路不错,就是我们对要搜索的词,提取出句子的主干,然后主干部分在检索时,是必须要命中的,如果不命中,就算该条数据与查询的词,相关性不大,这个方法不错,但前提是你如何在大规模的数据里面精准的提出这些精确的主干词呢? 使用机器学习或者是文本挖掘? 答案是肯定能做,只是需要另外设计了,这是最好的解决搜索的命中数量太多的办法。还有一个办法,是一种治标不治本的办法,比较容易实现,就是限制每次分词后最大匹配term的个数,也就是像
车道

北里
小庄
十里

饭店
必须命中3个或更多的term,我才认为相关性更大,或者有一个百分比来限制80%以上的命中,就算此条记录不错。这个使用solr的edismax可以解决。
两种解决方法,如下:

一: 使用edismax,在q里写完
name:北京xxxxx饭店后
在Raw Query Paramters参数里面写
defType=edismax&mm=80%25
然后查询即可,mm是最小匹配的数量,可以是个固定的值,也可也是个百分比。
二:在solr 的schema.xml中把solrQueryParser 的defaultOperator 变成AND



### 如何在 Solr 中执行条件查询 为了构建复杂的条件查询,在 Solr 中可以利用种方式来组合不同的查询条件。通常情况下,`q` 参数用于指定查询字符串,而 `fq` (filter query) 可以用来添加额外的过滤条件[^1]。 #### 使用布尔运算符 Solr 支持标准的布尔逻辑操作符 AND、OR 和 NOT 来连接个查询项: - **AND**: 所有条件都需满足 - **OR**: 至少有一个条件被满足 - **NOT**: 排除特定字段值的结果 例如,要查找文档中 title 字段包含 "solr" 并且 content 字段也包含 "search engine" 的记录,则可构造如下查询语句: ```plaintext title:solr AND content:"search engine" ``` #### 组合查询与分组 当有更复杂的需求时,可以通过括号来进行子表达式的分组,从而精确控制各个部分之间的关系。比如下面的例子展示了如何在一个查询里同时应用两个独立的 OR 查询并将其结果集相交: ```plaintext (title:solr OR description:solr) AND (content:optimization OR tags:performance) ``` #### 利用 Filter Query (`fq`) 对于那些不需要影响评分权重但是希望作为限定范围使用的参数,推荐采用 `fq` 参数。这不仅有助于提高性能,还能简化主查询结构。假设想要获取所有状态为 active 且创建日期在过去一年内的项目列表,那么就可以这样写: ```plaintext q=*:*&fq=status:active&fq=createdDate:[NOW/YEAR-1YEAR TO NOW] ``` 以上方法能够有效地帮助用户根据实际需求灵活地设置各种类型的条件查询。 ```python from pysolr import Solr # 创建 Solr 客户端实例 client = Solr('http://localhost:8983/solr/my_core') # 构建复合查询请求 response = client.search( q='*:*', fq=['status:active', 'createdDate:[NOW/YEAR-1YEAR TO NOW]',], ) for doc in response.docs: print(doc['id']) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值