Solr 自定义查询组件 return 不正确的分面计数
Solr custom query component does not return correct facet counts
我有一个简单的 Solr 查询组件如下:
public class QueryPreprocessingComponent extends QueryComponent implements PluginInfoInitialized {
private static final Logger LOG = LoggerFactory.getLogger( QueryPreprocessingComponent.class );
private ExactMatchQueryProcessor exactMatchQueryProcessor;
public void init( PluginInfo info ) {
initializeProcessors(info);
}
private void initializeProcessors(PluginInfo info) {
List<PluginInfo> queryPreProcessors = info.getChildren("queryPreProcessors")
.get(0).getChildren("queryPreProcessor");
for (PluginInfo queryProcessor : queryPreProcessors) {
initializeProcessor(queryProcessor);
}
}
private void initializeProcessor(PluginInfo queryProcessor) {
QueryProcessorParam processorName = QueryProcessorParam.valueOf(queryProcessor.name);
switch(processorName) {
case ExactMatchQueryProcessor:
exactMatchQueryProcessor = new ExactMatchQueryProcessor(queryProcessor.initArgs);
LOG.info("ExactMatchQueryProcessor initialized...");
break;
default: throw new AssertionError();
}
}
@Override
public void prepare( ResponseBuilder rb ) throws IOException
{
if (exactMatchQueryProcessor != null) {
exactMatchQueryProcessor.modifyForExactMatch(rb);
}
}
@Override
public void process(ResponseBuilder rb) throws IOException
{
// do nothing - needed so we don't execute the query here.
return;
}
}
除了当我在分布式请求中使用它时,它在功能上按预期工作,它返回的方面计数有问题。它使刻面数加倍。
请注意,我没有在插件中做任何与分面相关的事情。如果引用查询,exactMatchQueryProcessor.modifyForExactMatch(rb);
会进行非常少的处理,否则它什么都不做。即使未引用传入查询,也存在分面计数问题。即使我在 prepare 函数中注释所有内容,问题仍然存在。
请注意,此组件在 solrconfig.xml 中声明为第一个组件。
我通过将 class 扩展为 SearchComponent
而不是 QueryComponent
解决了这个问题。似乎 SearchComponent 比 QueryComponent 处于更高的抽象级别,当您想在分片之上的层上工作时很有用。
我有一个简单的 Solr 查询组件如下:
public class QueryPreprocessingComponent extends QueryComponent implements PluginInfoInitialized {
private static final Logger LOG = LoggerFactory.getLogger( QueryPreprocessingComponent.class );
private ExactMatchQueryProcessor exactMatchQueryProcessor;
public void init( PluginInfo info ) {
initializeProcessors(info);
}
private void initializeProcessors(PluginInfo info) {
List<PluginInfo> queryPreProcessors = info.getChildren("queryPreProcessors")
.get(0).getChildren("queryPreProcessor");
for (PluginInfo queryProcessor : queryPreProcessors) {
initializeProcessor(queryProcessor);
}
}
private void initializeProcessor(PluginInfo queryProcessor) {
QueryProcessorParam processorName = QueryProcessorParam.valueOf(queryProcessor.name);
switch(processorName) {
case ExactMatchQueryProcessor:
exactMatchQueryProcessor = new ExactMatchQueryProcessor(queryProcessor.initArgs);
LOG.info("ExactMatchQueryProcessor initialized...");
break;
default: throw new AssertionError();
}
}
@Override
public void prepare( ResponseBuilder rb ) throws IOException
{
if (exactMatchQueryProcessor != null) {
exactMatchQueryProcessor.modifyForExactMatch(rb);
}
}
@Override
public void process(ResponseBuilder rb) throws IOException
{
// do nothing - needed so we don't execute the query here.
return;
}
}
除了当我在分布式请求中使用它时,它在功能上按预期工作,它返回的方面计数有问题。它使刻面数加倍。
请注意,我没有在插件中做任何与分面相关的事情。如果引用查询,exactMatchQueryProcessor.modifyForExactMatch(rb);
会进行非常少的处理,否则它什么都不做。即使未引用传入查询,也存在分面计数问题。即使我在 prepare 函数中注释所有内容,问题仍然存在。
请注意,此组件在 solrconfig.xml 中声明为第一个组件。
我通过将 class 扩展为 SearchComponent
而不是 QueryComponent
解决了这个问题。似乎 SearchComponent 比 QueryComponent 处于更高的抽象级别,当您想在分片之上的层上工作时很有用。