Solr Lucene使用多个筛选器筛选索引文档

Solr Lucene使用多个筛选器筛选索引文档,solr,lucene,Solr,Lucene,我正在寻找一种方法来过滤多个条件的lucene索引。为此,我检查了两种不同的过滤搜索方法,它们都不适用于我: 使用布尔查询: BooleanQuery query=new BooleanQuery(); 字符串下限=“*”; 字符串上限=“*”; for(字符串字段名:关键字源字段){ TermRangeQuery rangeQuery=TermRangeQuery.NewStringGrange(字段名, 下、上、真、真); 添加(rangeQuery,Occurse.MUST); } Ter

我正在寻找一种方法来过滤多个条件的lucene索引。为此,我检查了两种不同的过滤搜索方法,它们都不适用于我:

使用布尔查询:

BooleanQuery query=new BooleanQuery();
字符串下限=“*”;
字符串上限=“*”;
for(字符串字段名:关键字源字段){
TermRangeQuery rangeQuery=TermRangeQuery.NewStringGrange(字段名,
下、上、真、真);
添加(rangeQuery,Occurse.MUST);
}
TermRangeQuery rangeQuery=TermRangeQuery.NewStringGrange(关键字字段,
下、上、真、真);
添加(rangeQuery,Occurse.NOT);
试一试{
TopDocs results=searcher.search(查询,空,
maxNumDocs);
使用布尔过滤器:

BooleanFilter=new BooleanFilter();
字符串下限=“*”;
字符串上限=“*”;
for(字符串字段名:关键字源字段){
TermRangeFilter rangeFilter=TermRangeFilter.NewStringGrange(字段名,
下、上、真、真);
filter.add(rangeFilter,Occurse.NOT);
}
TermRangeFilter rangeFilter=TermRangeFilter.NewStringGrange(关键字字段,
下、上、真、真);
filter.add(rangeFilter,Occurse.MUST);
试一试{
TopDocs results=searcher.search(新的MatchAllDocsQuery(),过滤器,
maxNumDocs);
我想知道所选查询的哪一部分是错误的?我正在查找的文档中,对于每个关键字源字段,该字段都有一些值,对于关键字字段也没有值。请指导我更正相应的查询


致以最诚挚的问候。

首先,为空字段的默认值编制索引是一个更好的主意。您在这里组合的每个子查询都必须枚举并搜索字段的所有可用值,以确定不存在任何值。这可能会非常慢

*
作为查询项传入不是构造开放式范围查询的有效方法。
null
是传入的正确值。将
null
作为较低的查询项传入并且
includeLower
=true将导致异常(因为它没有意义)

另外,
TermRangeQuery
不允许两端都为null,并将为此引发异常。因此,查询的至少一端必须是已定义的术语。您需要提供安全上限或下限来使用

因此,您可以执行以下操作:

Query subQuery = new TermRangeQuery("myField", "aaaaaaaaa", null, true, false);
或者使用过滤器,您可以:

Filter subFilter = new TermRangeFilter.More(myField, new BytesRef("aaaaaaaaa"));

当然,这有点骇人听闻,性能也会很糟糕。您可以使用缓存过滤器来缓解这一问题,但在字段为空的情况下,使用要搜索的默认值对数据进行索引确实是您应该做的事情。当您以支持各种搜索的方式对数据进行索引时,Lucene是最有用和性能最好的你想这样做。

不幸的是,我不能为我的字段使用默认值,因为它被认为是多值的,因此为了更改它的值,我必须先删除默认值!我尝试添加“N/A”作为相关字段的默认值。但这两种方法都不起作用。我假设你正在分析这些字段?如果是,则“N/A”这将是一个非常糟糕的选择,因为标准分析后剩下的不会是“n”。尝试一些受分析影响的东西。“nullval”或类似的东西。