如何有效地将布尔查询中的术语数组与Lucene.Net结合起来?

如何有效地将布尔查询中的术语数组与Lucene.Net结合起来?,lucene,lucene.net,Lucene,Lucene.net,我需要一个关于如何使用BooleanQuery(或另一种更有效的方式)编写从Lucene索引中删除文档的高效查询的建议-该查询应将多个术语与Guid值(通过“Guid”字段删除文档)以及“版本”字段相结合 索引可能包含“Guid”字段中值相同,但“版本”字段中值不同的文档 以下是我的职责: private void RemoveFromIndex(string[] guids, IndexWriter writer) { var terms = guids

我需要一个关于如何使用BooleanQuery(或另一种更有效的方式)编写从Lucene索引中删除文档的高效查询的建议-该查询应将多个术语与Guid值(通过“Guid”字段删除文档)以及“版本”字段相结合

索引可能包含“Guid”字段中值相同,但“版本”字段中值不同的文档

以下是我的职责:

private void RemoveFromIndex(string[] guids, IndexWriter writer)
        {
            var terms = guids.Select(guid => new Term("Guid", guid)).ToArray();

            if (!isGlobalIndex)
            {
                writer.DeleteDocuments(terms); //This is working perfectly
            }
            else
            {
                //Delete items but only of the corresponding version
                BooleanQuery bQ = new BooleanQuery();

                if (!string.IsNullOrEmpty(repository.versionName))
                {
                    bQ.Add(new TermQuery(new Term("Version", repository.versionName)), Occur.MUST);
                }

            //Is there a more efficient way of doing it?
            foreach (var term in terms) {
                bQ.Add(new TermQuery(term), Occur.SHOULD);
            }

                writer.DeleteDocuments(bQ);
            }
        }

不,这是实现你所描述的最有效的方法。对于代码的第二部分(向外的“else”子句),Lucene查询类似于:

+GUID:someGuidValue version:v1 version:v2 version:v3
您可以打印查询对象(或对其进行调试),以确认这确实是它为您创建的Lucene查询。如果是的话,这是最简单的方法

==根据注释更新:==

首先,我不太确定您使用的是什么Lucene API。我对javaapi非常熟悉。在Java API中,您可以对布尔查询执行以下操作:

BooleanQuery bq = new BooleanQuery();
bq.setMaxClauseCount(3000);
这将帮助您避免在while循环中移动查询


此外,就多术语查询而言,还有一个基本(抽象)多术语查询类,以及它的一些实际实现,例如:FuzzyQuery、NumericRangeQueryy、RegexQuery等。这些是用于涉及多个术语的更专业/特殊查询。对于这些简单的查询条件,BooleanQuery工作得很好。

谢谢你的回答,我最终以这种方式实现了它,尽管我不得不移动编写器。删除循环中的文档(bQ),以防止“过多条款”异常。。我希望能得到一些关于多术语查询的指导。。。