我正在尝试在 SolrNET 实现中实现 localParams,但是当我们尝试在具有多个值的查询中为字段添加 localParams 前缀时遇到问题。
我们正在尝试使用 localParams 来标记和排除过滤器。有关更多信息,请参阅:http ://wiki.apache.org/solr/SimpleFacetParameters#Tagging_and_ exclude_Filters。
为此,我们需要为我们的过滤器/构面字段(以下称为 field_name)标记 filterQuery,并在我们的构面字段中排除该标记。The facetField exclusion of a tag works perfectly but we are having problems with the filterQuery when multiple values are selected.
我发现生成的查询字符串的差异如下:
没有 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"
我们通过调用来启动 Solr 查询:SolrInstance.Query(ISolrQuery query, QueryOptions options)
并且可以在集合中找到受此问题影响的过滤器查询QueryOptions.FilterQueries
,定义如下:
SolrNet.SolrQueryInList
.FieldName: {!paramKey=paramValue}field_name
.List
.string[]
"value1",
"value2"
localParam(s) 已经/已经以该.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 添加前缀。