IEnumerable <SpanTermQuery> WildcardTerms(IEnumerable <Term> terms, IndexReader reader) { if (!HasWildcards) { foreach (Term t in terms) { yield return(new SpanTermQuery(t)); } } else { int maxTerms = 1000; foreach (Term t in terms) { var termEnum = new WildcardTermEnum(reader, t); var term = termEnum.Term(); while (term != null) { if (--maxTerms < 0) { throw new Exception("Too many matches for wildcard query, please be more specific."); } yield return(new SpanTermQuery(term)); termEnum.Next(); term = termEnum.Term(); } } } }
static void Main(string[] args) { RAMDirectory dir = new RAMDirectory(); IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED); Document d = new Document(); Field f = new Field("text", "This is some erfand erftyas poliot polioasd poliasdas data to test the wild card term enums. Lets see how it works out.", Field.Store.YES, Field.Index.ANALYZED); d.Add(f); iw.AddDocument(d); iw.Commit(); IndexReader reader = iw.GetReader(); QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, "text", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)); // parser.MultiTermRewriteMethod = MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE; Query q = parser.Parse("(poli* && erf*) && test* && (asd* || res*) && aterm"); Query q2 = parser.Parse("poli*"); //var rq = q.Rewrite(reader); //ISet<Term> terms = new HashSet<Term>(); //rq.ExtractTerms(terms); List <PrefixQuery> prefixQueries = null; if (q is PrefixQuery) { prefixQueries = new List <PrefixQuery>(); prefixQueries.Add(q as PrefixQuery); } else if (q is BooleanQuery) { prefixQueries = ExtractQueries(q as BooleanQuery); } foreach (var pq in prefixQueries) { WildcardTermEnum termEnum = new WildcardTermEnum(reader, new Term(pq.Prefix.Field, pq.Prefix.Text + "*")); if (termEnum.Term != null) { Console.WriteLine(termEnum.Term.Text); } while (termEnum.Next()) { Console.WriteLine(termEnum.Term.Text); } } Console.ReadLine(); }