搜索 Lucene.Net 具有值(x 或 y 或 z)及更多的字段名
Search Lucene.Net for fieldname which has value (x or y or z) and more
我有一个数字字段。
它可以有一些值; 0,7,12,16,18,101 ++
,但每个文档只有这些值之一
我想检索值为 7,12 和 16 的文档
我尝试过使用带有术语的 BooleanQuery,但我没有成功。我相信那是因为我不是在搜索字符串。
我尝试使用 NumericRangeFilter.NewIntRange(
,并将最小值和最大值设置为我有兴趣检索的实际值。
我有这个代码:
public static Query AddRangeFilter(this Query query, string fieldName, IEnumerable<int> validAlternatives)
{
if (!validAlternatives.Any())
return query;
foreach (var alternative in validAlternatives)
{
var filter = NumericRangeFilter.NewIntRange(fieldName, 1, alternative, alternative, true, true);
query = new FilteredQuery(query, filter);
}
return query;
}
如果我在列表中发送一个单数,效果会很好。但是,如果我发送更多,自然就不起作用,因为它正在寻找 t.ex。值为 7 和 12 的文档不存在,因为所有文档都只有一个单数。
我如何搜索 7 或 12?
请注意,AddRangeFilter
中的 this Query query
已经包含部分查询。
我找到了解决它的方法。它并不完美,如果你有更多这些,它可能效率很低。
public static Query AddRangeFilter(this Query query, string fieldName, IEnumerable<int> validAlternatives)
{
if (!validAlternatives.Any())
return query;
var booleanQuery = new BooleanQuery { MinimumNumberShouldMatch = 1 };
foreach (var alternative in validAlternatives)
{
var thing = NumericRangeFilter.NewIntRange(fieldName, 1, alternative, alternative, true, true);
booleanQuery.Add(new FilteredQuery(query, thing), Occur.SHOULD);
}
return booleanQuery;
}
如果有更好的答案,我很想看看。
我有一个数字字段。
它可以有一些值; 0,7,12,16,18,101 ++
,但每个文档只有这些值之一
我想检索值为 7,12 和 16 的文档
我尝试过使用带有术语的 BooleanQuery,但我没有成功。我相信那是因为我不是在搜索字符串。
我尝试使用 NumericRangeFilter.NewIntRange(
,并将最小值和最大值设置为我有兴趣检索的实际值。
我有这个代码:
public static Query AddRangeFilter(this Query query, string fieldName, IEnumerable<int> validAlternatives)
{
if (!validAlternatives.Any())
return query;
foreach (var alternative in validAlternatives)
{
var filter = NumericRangeFilter.NewIntRange(fieldName, 1, alternative, alternative, true, true);
query = new FilteredQuery(query, filter);
}
return query;
}
如果我在列表中发送一个单数,效果会很好。但是,如果我发送更多,自然就不起作用,因为它正在寻找 t.ex。值为 7 和 12 的文档不存在,因为所有文档都只有一个单数。
我如何搜索 7 或 12?
请注意,AddRangeFilter
中的 this Query query
已经包含部分查询。
我找到了解决它的方法。它并不完美,如果你有更多这些,它可能效率很低。
public static Query AddRangeFilter(this Query query, string fieldName, IEnumerable<int> validAlternatives)
{
if (!validAlternatives.Any())
return query;
var booleanQuery = new BooleanQuery { MinimumNumberShouldMatch = 1 };
foreach (var alternative in validAlternatives)
{
var thing = NumericRangeFilter.NewIntRange(fieldName, 1, alternative, alternative, true, true);
booleanQuery.Add(new FilteredQuery(query, thing), Occur.SHOULD);
}
return booleanQuery;
}
如果有更好的答案,我很想看看。