We are trying to search whether documents have a particular field value in a collection of possible values,
field:[value1, value2, value3, ..., valueN]
which would return the element if it matches any of the input values, similar to SQL's IN()
operator.
This would be similar to a range
query, but the elements do not necessarily describe a range.
An example using Lucene.Net API would be,
var query = new QueryParser(version, "FieldName", analyzer).In("value1", "value2", "value3");
Is this possible in Lucene.Net?
field:value1 field:value2 ....
should do the trick. By default all terms are OR
ed.
Programmatically, you can try,
public static Query In(string fieldName, IEnumerable<string> values)
{
var query = new BooleanQuery();
foreach (var val in values)
{
query.Add(new TermQuery(new Lucene.Net.Index.Term(fieldName, val)), BooleanClause.Occur.SHOULD);
}
return query;
}
As @I4V mentioned, Lucene OR
s terms by default, so this should give you the wanted result,
public Query In(string propertyName, IEnumerable<string> collection)
{
var query = new QueryParser(version, propertyName, analyzer).Parse(string.Join(" ", collection));
return query;
}
based on,
field:value1, value2, value3, ..., valueN
will return any document with at least one value in the collection.
来源:https://stackoverflow.com/questions/14405203/how-to-query-for-terms-in-a-collection-using-lucene-net-similar-to-sqls-in-ope