1.重写自己的Similarity 或者修改org.apache.lucene.search.similarities.DefaultSimilarity,重写 scorePayload方法,这样生成索引时payload分数才会生效了,否则永远是1(默认值),如果重写自己的similarity,需要在 org.apache.solr.schema.IndexSchema中当node==null时修改设置自己的similarity
Node node = (Node) xpath.evaluate("/schema/similarity", document, XPathConstants.NODE);
if (node==null) {
similarityFactory = new SimilarityFactory() {
@Override
public Similarity getSimilarity() {
return Similarity.getDefault();
}
};
log.debug("using default similarity");
} else {
final Object obj = loader.newInstance(((Element) node).getAttribute("class"));
if (obj instanceof SimilarityFactory) {
// configure a factory, get a similarity back
SolrParams params = SolrParams.toSolrParams(DOMUtil.childNodesToNamedList(node));
similarityFactory = (SimilarityFactory)obj;
similarityFactory.init(params);
} else {
// just like always, assume it's a Similarlity and get a ClassCastException - reasonable error handling
similarityFactory = new SimilarityFactory() {
@Override
public Similarity getSimilarity() {
return (Similarity) obj;
}
};
}
if (similarityFactory instanceof SchemaAware){
schemaAware.add((SchemaAware) similarityFactory);
}
log.debug("using similarity factory" + similarityFactory.getClass().getName());
}
或者在schema中设置自己的similarity
<similarity class="com.example.solr.CustomSimilarityFactory"> </similarity>
@Override
public float scorePayload(int doc, int start, int end, BytesRef payload) {
return PayloadHelper.decodeFloat(payload.bytes,payload.offset);
}
2.扩展payload的搜索插件。
package org.suishi.solr;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.payloads.AveragePayloadFunction;
import org.apache.lucene.search.payloads.MaxPayloadFunction;
import org.apache.lucene.search.payloads.MinPayloadFunction;
import org.apache.lucene.search.payloads.PayloadFunction;
import org.apache.lucene.search.payloads.PayloadTermQuery;
import org.apache.solr.common.SolrException;
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;
import org.apache.solr.search.QueryParsing;
public class PayloadTermQueryPlugin extends QParserPlugin {
@Override
public void init(NamedList args) {
}
@Override
public QParser createParser(String qstr, SolrParams localParams,
SolrParams params, SolrQueryRequest req) {
return new QParser(qstr, localParams, params, req) {
public Query parse() throws ParseException {
return new PayloadTermQuery(new Term(
localParams.get(QueryParsing.F),
localParams.get(QueryParsing.V)),
createPayloadFunction(localParams.get("func")), false);
}
};
}
private PayloadFunction createPayloadFunction(String func) {
// TODO: refactor so that payload functions are registered as plugins
// and loaded
// through SolrResourceLoader.
PayloadFunction payloadFunction = null;
if ("min".equals(func)) {
payloadFunction = new MinPayloadFunction();
} else if ("avg".equals(func)) {
payloadFunction = new AveragePayloadFunction();
} else if ("max".equals(func)) {
payloadFunction = new MaxPayloadFunction();
}
if (payloadFunction == null) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST,
"unknown PayloadFunction: " + func);
}
return payloadFunction;
}
}
3. 在solrconfig配置文件中添加2中的插件。
<queryParsername="payload"class="org.suishi.solr.PayloadTermQueryPlugin"/>
4.payload特用的查询语句。
http://localhost:8983/solr/select?q={!payload%20f=payloadfield%20func=avg}searchvalue&debugQuery=true
http://blog.csdn.net/july_2/article/details/7951188
大家可以加我个人微信号:scccdgf
相关推荐
Solr 4.0 是Apache Lucene项目的一个子项目,是一个高性能、全文本搜索服务器,为企业级数据提供强大的搜索功能。源代码实例是学习Solr内部工作原理和自定义功能的关键资源,尤其对于开发者而言,深入理解源码有助于...
标题中的“php与solr交互扩展库包”指的是PHP与Apache Solr搜索引擎之间的一个扩展库,这个库使得在PHP环境中可以方便地与Solr服务进行数据的增删查改操作。Solr是一款强大的、高性能的全文检索服务器,常用于大型...
电商搜索引擎solr的扩展词库,20W+的专业名词,txt文件;
总之,掌握Solr的Linux安装、扩展词典配置和停词管理是提升搜索质量的基础。通过深入学习Solr的文档和实践经验,开发者可以进一步优化搜索性能,满足复杂的企业级搜索需求。在实际项目中,结合具体业务场景,灵活...
Solr Redis 扩展Solr Redis 扩展此扩展是一个 ParserPlugin,它根据存储在 Redis 中的数据提供 Solr 查询解析器。RedisQParserPlugin 与 Redis 创建连接并将连接对象传递给负责获取数据和构建查询的 RedisQParser。...
可做为电商搜索引擎solr的扩展词库,20W+专业名词,txt文件可修改后缀名,不定时更新。
Solr扩展依赖Jar包是Apache Solr项目中的一个重要组成部分,它是Solr运行和功能扩展的基础。Solr是一款基于Lucene的开源全文检索服务器,广泛应用于大数据环境下的全文检索、数据分析和云计算服务。为了实现更复杂、...
solr扩展词库,共100多万条,供大家下载使用,内容很全
6. **分布式搜索**:SolrCloud是Solr的分布式搜索和处理模式,4.0版本可能已开始支持。源码可以帮助理解ZooKeeper协调下的集群管理和分布式搜索策略。 7. **插件机制**:Solr支持丰富的插件系统,允许用户自定义...
PHP扩展Solr是PHP与Apache Solr搜索引擎之间的桥梁,它允许PHP应用程序无缝地与Solr服务器进行交互,执行搜索、索引操作等。在Linux环境下安装这个扩展,需要遵循一系列步骤,确保所有依赖项都已满足,并正确编译和...
- "Solr 云" 描述了如何在 AWS EC2 等云平台上部署和运行 SolrCloud,这是构建可扩展搜索解决方案的关键技术。 - "升级 Solr 集群" 提供了升级 Solr 集群时的注意事项和步骤,确保在升级过程中数据安全和系统稳定性...
分离部署Solr的好处在于提高了系统的可扩展性和稳定性,特别是在处理大量数据和高并发搜索请求时。同时,这样可以使得Alfresco与Solr的升级和维护更加独立,降低了整体系统的复杂性。 在实际生产环境中,可能还需要...
自从lucene和solr推出4.0版本后 ik分词的调用接口已经不适用了,虽说ik最新ff版适用于solr4.0 但是solr4.2出来之后发现又不适用了,本人花了一点功夫熟悉solr4.2的分词调用接口补写了一个IkTokenizerFactory类 经...
Solr是中国Apache软件基金会开发的一款开源全文搜索引擎,它基于Java平台,可以实现高效、可扩展的搜索和导航功能。在企业级应用中,Solr常用于构建大规模的、高性能的搜索解决方案。标题中的"solr-4.10.3.zip"表明...
Solr是Apache软件基金会开发的一款开源全文搜索引擎,它基于Java平台,可以实现高效、可扩展的搜索和导航功能。在本案例中,我们讨论的是Solr的6.6.2版本,这是一个完整的包,适用于在Linux环境中进行部署和运行。 ...
Solr,全称为Apache Solr,是Apache软件基金会的一个开源项目,主要用来处理全文搜索和企业级的搜索应用。它基于Java,利用Lucene库构建,提供了高效、可扩展的搜索和导航功能。Solr-9.0.0是该软件的最新版本,此...
Solr Redis扩展该扩展是一个ParserPlugin,它基于Redis中存储的数据提供Solr查询解析器。 RedisQParserPlugin创建与Redis的连接,并将连接对象传递给负责获取数据和构建查询的RedisQParser。快速开始使用Maven进行...
这本书是针对Solr 4.0版本的一本实战指南,由Pete Muir和Tommaso Teofili合著。书中包含了大量解决常见问题和实现特定功能的实例,旨在帮助读者快速上手并掌握Solr的核心操作。内容涵盖设置和配置Solr服务器、索引...
mmseg4j是一个很出色的中文分词器,当前最新版本为1.9,官方的版本和solr4.0组合使用时因为solr4.0接口的变化导致无法正常运行,所以需要对mmseg4j中的部分代码进行修改,该版本是本人修改后的版本,测试后可以正常...