解决solr搜索多词匹配度和排序方案

转载请标明出处:http://blog.csdn.net/hu948162999/article/details/47727159

本文主要介绍了在短语、句子、多词查询中,solr在控制查询命中数量、之后再对结果集进行排序

在solr中
默认是or 查询,也就是说:如果搜索q 中 分出来的词越多,所匹配的数量也就越多。如:搜索短语  “中国联想笔记本” ,分词结果:中国 、联想 、 笔记本。

覆盖结果集:只要文档中包含这3个任意词,都给返回。

排序结果:按照solr的打分公式。默认匹配相关度最高的文档放在第一位。。简单的说。就是文档中,同时含有 中国
、联想 、 笔记本 分值最高。这种需求一般可以满足部分的企业级搜索。

但是:如果需要自定义排序的话,问题就逐渐暴露了。

通过requestHandler queryParser edismax 中的 df qf,通过字段的权重配置和 各个维度的积分模型之后,得出的排序。就不一定按照同时 含有 中国
、联想 、 笔记本优先级排序了。。有些只包含 中国  这个词的优先级很高 也有可能。这种结果排序 明显不能理解和符合用户的意思。

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

在上篇文章中,提到了两种关于solr 对短语、短句(非关键词)的搜索精度解决方案,solr控制多词联合查询命中的数量

但是上面解决了返回精度的问题。但是设置mm匹配精度 或者全词匹配defaultOperator=“AND”。df和qf 自定义的排序 就不起作用了。

默认情况下,Solr查询语法只有两种形式:关键词或者以空格分隔的关键词组。当查询英文时,英文本身就是以空格来区分词的,所以Solr就能直接获取英文词并组装Query;但是中文句子中间没有空格,Solr查询时把整个句子交给Query,然后由Query再按照Field来分词、查询。这样就丧失了DisMax中qf所能带来的好处。

所以:思考了这么一种思路。对“中国联想笔记本”分词之后。对每个词单元
中间接一个空格,就可以满足控制搜索词匹配度的前提下,提供自定义排序。这个时候就需要重写lucene的默认的queryParser 。

版本:solr4.10.3

solrconfig.xml代码

<span style="font-size:14px;"><str name="defType">myparser</str></span>
<span style="font-size:14px;"> <!-- 自定义queryParser -->
  <queryParser name="myparser" class="com.lubanec.util.MyQParserPlugin"/></span>

重写QParserPlugin和DisMaxQParser

<span style="font-size:14px;">package com.lubanec.util;

import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.QParser;
import org.apache.solr.search.QParserPlugin;

public class MyQParserPlugin extends QParserPlugin {

	public void init(NamedList args) {
	}

	public QParser createParser(String qstr, SolrParams localParams,
			SolrParams params, SolrQueryRequest req) {
		return new MyQParser(qstr, localParams, params, req);
	}
}
</span>
<span style="font-size:14px;">package com.lubanec.util;

import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.search.DisMaxQParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyQParser extends DisMaxQParser {
	private static Logger log = LoggerFactory.getLogger(MyQParser.class);

	public MyQParser(String qstr, SolrParams localParams, SolrParams params,
			SolrQueryRequest req) {
		super(qstr, localParams, params, req);
		Analyzer analyzer = req.getSchema().getQueryAnalyzer();
		if (null == analyzer)
			return;
		StringBuilder norm = new StringBuilder();
//		log.info("before analyzer, qstr=" + this.qstr);
		try {
			TokenStream ts = analyzer.tokenStream(req.getSchema().getDefaultSearchFieldName(), new StringReader(this.qstr));
			ts.reset();
			while (ts.incrementToken()) {
			  CharTermAttribute termAttribute = ts.getAttribute(CharTermAttribute.class);
//              System.out.println(termAttribute.toString());
              norm.append(new String(termAttribute.toString())).append(" ");
			}
			ts.end();
			ts.close();
		} catch (Exception ex) {
			log.info("Ex=" + ex);
		}
		if (norm.length() > 0)
			this.qstr = norm.toString();
//		log.info("after analyzer, qstr=" + this.qstr);
	}

}
</span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-09 19:41:01

解决solr搜索多词匹配度和排序方案的相关文章

solr 搜索 的 完全匹配方法

最近是用 solr 做搜索引擎,但是由于搜索特殊性,不需要分词后的检索结果,比如 搜 "汪翰翔" 会出来包含汪,翰,翔三中词的结果,但是需求只需要 完全匹配 "汪翰翔" 的结果, 其方法是 在 将关键字 用 双引号 包起来. 例如 :http://localhost:8080/solr/select/?q=content:"汪翰翔"&version=2.2&start=0&rows=10&indent=on&

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

1.本文涉及全文检索中那两个概念? 2.众多结果中,排序的标准是什么? 3.如何合理的控制solr查询的命中的数量和质量? 在一些日常的文章中或一些信息中,都有一些高频词,而这些高频词,在参与查询时,往往会造成,大量的结果集命中. 什么意思呢? 举个例子,假如我们现在做的是饭店的搜索,在我们的索引库里有一列name这个field,这里面大部分都是xxx饭店,假如你搜索的时候搜一个xxx饭店,会被分词成: xxx 饭店 然后xxx命中只有10条结果集, 而饭店确命中了20万结果集,这么以来总结果可

Solr搜索技术

Solr搜索技术 今日大纲 回顾上一天的内容: 倒排索引 lucene和solr的关系 lucene api的使用 CRUD 文档.字段.目录对象(类).索引写入器类.索引写入器配置类.IK分词器 查询解析器.查询对象(用户要查询的内容).索引搜索器(索引库的物理位置).排名文档集合(包含得分文档数组) 六种高级查询(相似度查询) 分词器(扩展词典.停用词典) 分页 得分(激励因子(作弊)) 高亮 排序 ●    Solr简介.运行 ●    Solr基本使用 ●    Solr Core 配置

一个有意思的需求——中文匹配度

引言 最近LZ带头在做一个互联网项目,互联网的东西总是那么新鲜,这也难怪大部分猿友都喜欢互联网.这个互联网项目不仅让LZ开发了一个HBase大数据应用,近期的一次需求讨论会上,又出来一个小需求,蛮有意思的.这些需求在之前枯燥的企业内部应用开发中,还是很难见到的,毕竟内部应用更多的是业务流程的体现. 具体的需求这里不方便透露,但简单的描述一下需求,就是如何判断两个公司名是一个.这其实就是Java当中字符串的相等判断,最简单的当然是用equals来判断.但是由于实际情况是,公司名是由客户手动输出的,

搜索里的相似度计算-最长公共字串

相似度计算的任务是根据两段输入文本的相似度返回从0到1之间的相似度值:完全不相似,则返回0,:完全相同,返回1.衡量两端文字距离的常用方法有:海明距离(Hamming distance),编辑距离,欧氏距离,文档向量的夹角余弦距离,最长公共字串. 1. 余弦相似度 把两篇文档看作是词的向量,如果x,y为两篇文档的向量,则:Cos(x, y) = (x * y) / (||x|| * ||y||) 使用Hashmap可以很方便的把这个计算出来 2. 最长公共字串(Longest Common Su

solr搜索流程

一.solr搜索流程介绍 1. 前面我们已经学习过Lucene搜索的流程,让我们再来回顾一下 流程说明: 首先获取用户输入的查询串,使用查询解析器QueryParser解析查询串生成查询对象Query,使用所有搜索器IndexSearcher执行查询对象Query得到TopDocs,遍历TopDocs得到文档Document 2. Solr搜索的工作流程: 流程说明: 用户输入查询字符串,根据用户的请求类型qt(查询为/select)选择请求处理器RequestHandler,根据用户输入的参数

JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误

问题一:出现控制台坏的响应错误一Bad request 控制台出现错误如下: Bad Request request: http://hostIP:8983/solr/update?wt=javabin&version=1 解决方法: 出现以上错误的原因是,solr服务器上配置的Field和javabean提交的Field不能对应, 导致solr服务器找不到域,拒绝访问. 打开SOLR_HOME下的conf文件夹找到schema.xml文件,在其中添加对应的域. 例如以下代码添加了:title,

Solr 搜索的过程和所须要的參数

一个典型的搜索处理过程,以及所须要的參数例如以下: qt:指定一个RequestHandler,即/select.缺省是使用DisMax RequestHandler defType:选择一个query parser.缺省是RequestHandler中配置的那个 qf:指定须要搜索的field.假设不指定就搜索全部的field start, rows:指明分页參数 fq:指明须要怎样过滤搜索结果.以及缓存搜索结果 wt:指定搜索结果的格式,比方json或xml 搜索所须要的參数基本上能够分为三

二次开发 提高财务软件与企业需求的匹配度

财务管理软件作为企业管理不可或缺的管理工具,能够帮助企业有效实现资金的科学管控,提高资金部署的精准度.并且,企业在选购财务管理软件时,甚少能够做到一锤子买卖,因为随着企业的不断发展壮大,势必要根据企业新的特点进行二次开发. 二次开发,在不少企业眼中认为或许是一种浪费资金的表现,因此总是希望能够购买一款能够一直用下去的财务管理软件.然而,这些企业却忽略了时代在变化,市场在变化,企业随着市场的变化也会进行新的发展方向转变. 对于这种转变,财务管理软件如果能够满足,自然是最好不过.如果不能,那么财务管