我正在尝试在SolrNET实现中实现localParams,但是当我们尝试在具有多个值的查询中使用localParams为字段添加前缀时遇到问题。
我们正在尝试使用localParams标记和排除过滤器。有关详细信息,请参阅:http://wiki.apache.org/solr/SimpleFacetParameters#Tagging_and_excluding_Filters。
为了实现这一点,我们需要为filter / facet字段标记filterQuery(在下面称为field_name),并在facetField中排除标记。 facetField对标记的排除效果很好,但是当选择多个值时,我们遇到了filterQuery的问题。
我发现生成的查询字符串的区别如下:
没有localParams:
fq=field_name:"value1,value2"
使用localParams:
fq=({!paramKey=paramValue}field_name:"value1" OR {!paramKey=paramValue}field_name:"value2")
预期:
fq={!paramKey=paramValue}field_name:"value1,value2"
我们通过调用SolrInstance.Query(ISolrQuery query, QueryOptions options)
启动Solr查询,受此问题影响的过滤查询可在QueryOptions.FilterQueries
集合中找到,如下所示:
SolrNet.SolrQueryInList
.FieldName: {!paramKey=paramValue}field_name
.List
.string[]
"value1",
"value2"
localParam已经/ .FieldName
属性作为前缀。这不起作用,可能是因为Solr不能将{!paramKey=paramValue}field_name
识别为有效的FieldName,这似乎是引发异常的原因。
任何人都可以提供有关如何在不解决此问题的情况下为SolrNET实施localParams的任何建议。该实现适用于单个值,但会针对多个值抛出以下异常:
[SolrNet.Exceptions.InvalidFieldException] = {"Bad Request"}
我们使用以下版本: SolrNET:v0.3.0 Solr:v4.3.0
将localParams应用于filterQueries的代码可以在下面找到:
foreach (var filterQuery in parameters.FilterQuery)
{
if (parameters.LocalParams.Any(x => x.Field == filterQuery.Field && x.QueryType == QueryType.Filter))
{
var valueDictionary = parameters.LocalParams.Where(x => x.QueryType == QueryType.Filter && x.Field == filterQuery.Field).ToDictionary(param => param.Action, param => param.Value);
filterQuery.Field = new SolrQuery(new LocalParams(valueDictionary) + filterQuery.Field).Query;
}
}
上面的代码遍历filterQueries并使用localParams语法为.Field添加前缀。