我有一个Lucene索引,其中包含具有“类型”字段的文档,该字段可以是“文章”,“论坛”或“博客”三个值之一。我希望用户能够在这些类型中进行搜索(每种文档类型都有一个复选框)
如何根据用户选择的类型创建Lucene查询?
有两个先决条件:
作为引用,如果我要用SQL编写(用于“博客或论坛搜索”),我会写:
SELECT * FROM Docs
WHERE [type] in ('blog', 'forum')
最佳答案
供引用,如果其他任何人遇到此问题,这是我的解决方案:
IList<string> ALL_TYPES = new[] { "article", "blog", "forum" };
string q = ...; // The user's search string
IList<string> includeTypes = ...; // List of types to include
Query searchQuery = parser.Parse(q);
Query parentQuery = new BooleanQuery();
parentQuery.Add(searchQuery, BooleanClause.Occur.SHOULD);
// Invert the logic, exclude the other types
foreach (var type in ALL_TYPES.Except(includeTypes))
{
query.Add(
new TermQuery(new Term("type", type)),
BooleanClause.Occur.MUST_NOT
);
}
searchQuery = parentQuery;
我颠倒了逻辑(即排除了用户未选择的类型),因为如果不这样做,结果的顺序就会丢失。我不确定为什么...!很可惜,因为它使代码不太清晰/难以维护,但至少可以正常工作!
关于Lucene查询- "Match exactly one of x, y, z",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1553966/