【问题标题】:Lucene filtering indexed documents with multiple filtersLucene 使用多个过滤器过滤索引文档
【发布时间】:2015-04-06 11:34:30
【问题描述】:

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

使用布尔查询:

BooleanQuery query = new BooleanQuery();
    String lower = "*";
    String upper = "*";
    for (String fieldName : keywordSourceFields) {
      TermRangeQuery rangeQuery = TermRangeQuery.newStringRange(fieldName,
          lower, upper, true, true);
      query.add(rangeQuery, Occur.MUST);
    }
    TermRangeQuery rangeQuery = TermRangeQuery.newStringRange(keywordField,
        lower, upper, true, true);
    query.add(rangeQuery, Occur.MUST_NOT);
    try {
      TopDocs results = searcher.search(query, null,
          maxNumDocs);

使用布尔过滤器:

BooleanFilter filter = new BooleanFilter();
    String lower = "*";
    String upper = "*";
    for (String fieldName : keywordSourceFields) {
      TermRangeFilter rangeFilter = TermRangeFilter.newStringRange(fieldName,
          lower, upper, true, true);
      filter.add(rangeFilter, Occur.MUST_NOT);
    }
    TermRangeFilter rangeFilter = TermRangeFilter.newStringRange(keywordField,
        lower, upper, true, true);
    filter.add(rangeFilter, Occur.MUST);
    try {
      TopDocs results = searcher.search(new MatchAllDocsQuery(), filter,
          maxNumDocs);

我想知道所选查询的哪一部分是错误的?我正在寻找对于每个keywordSourceFields,该字段都有一些值并且也没有关键字字段值的文档。请指导我纠正相应的查询。

最好的问候。

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

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

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

    另外,TermRangeQuery 不允许两端都为空,并且会为此抛出异常。因此,查询的至少一端必须是已定义的术语。您需要想出一个安全的上限或下限才能使用。

    所以,你可以这样做:

    Query subQuery = new TermRangeQuery("myField", "aaaaaaaaa", null, true, false);
    

    或者使用过滤器:

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

    当然,这有点 hacky,而且性能会很糟糕。您可以使用缓存过滤器来缓解这种情况,但是使用默认值索引数据以在空字段的情况下进行搜索确实是您应该做的。当您以支持您想要执行的搜索类型的方式索引数据时,Lucene 最有用且性能最高。

    【讨论】:

    • 不幸的是我不能为我的字段使用默认值,因为它被认为是多值的,因此为了改变它的值,我必须先删除默认值!
    • 我尝试添加“N/A”作为相关字段的默认值。但它也没有工作。
    • 我假设您正在分析这些字段?如果是这样,“N/A”将是一个非常糟糕的选择,因为在标准分析之后剩下的将不是“n”。尝试一些会受到分析影响的东西。 “nullval”或类似的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2022-01-17
    • 1970-01-01
    相关资源
    最近更新 更多