1

我正在尝试在 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 添加前缀。

4

0 回答 0