/// <summary> /// Perform synonym expansion on a query. /// </summary> /// <param name="query">users query that is assumed to not have any "special" query syntax, thus it should be just normal words, so "big dog" makes sense, but a query like "title:foo^1.2" doesn't as this should presumably be passed directly to the default query parser </param> /// <param name="syns">a opened to the Lucene index you previously created with <see cref="Syns2Index"/>. The searcher is not closed or otherwise altered. </param> /// <param name="a">optional analyzer used to parse the users query else <see cref="StandardAnalyzer"/> is used </param> /// <param name="field">optional field name to search in or null if you want the default of "contents" </param> /// <param name="boost">optional boost applied to synonyms else no boost is applied </param> /// <returns>the expanded Query </returns> public static Query Expand(String query, Searcher syns, Analyzer a, String field, float boost) { already = new List <String>(); // avoid dups var top = new List <String>(); // needs to be separately listed.. if (field == null) { field = "contents"; } if (a == null) { a = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_CURRENT); } // [1] Parse query into separate words so that when we expand we can avoid dups var ts = a.TokenStream(field, new StringReader(query)); var termAtt = ts.AddAttribute <TermAttribute>(); while (ts.IncrementToken()) { var word = termAtt.Term; if (!already.Contains(word)) { already.Add(word); top.Add(word); } } tmp = new BooleanQuery(); // [2] form query System.Collections.IEnumerator it = top.GetEnumerator(); while (it.MoveNext()) { // [2a] add to level words in var word = (String)it.Current; var tq = new TermQuery(new Term(field, word)); tmp.Add(tq, Occur.SHOULD); var c = new CollectorImpl(field, boost); syns.Search(new TermQuery(new Term(Syns2Index.F_WORD, word)), c); } return(tmp); }
/// <summary> /// Perform synonym expansion on a query. /// </summary> /// <param name="query">query</param> /// <param name="syns">syns</param> /// <param name="a">a</param> /// <param name="field">field</param> /// <param name="boost">boost</param> public static Query Expand(String query, Searcher syns, Analyzer a, String field, float boost) { already = new List <String>(); // avoid dups var top = new List <String>(); // needs to be separately listed.. var ts = a.TokenStream(field, new StringReader(query)); var termAtt = ts.AddAttribute <TermAttribute>(); while (ts.IncrementToken()) { var word = termAtt.Term; if (!already.Contains(word)) { already.Add(word); top.Add(word); } } tmp = new BooleanQuery(); // [2] form query System.Collections.IEnumerator it = top.GetEnumerator(); while (it.MoveNext()) { // [2a] add to level words in var word = (String)it.Current; var tq = new TermQuery(new Term(field, word)); tmp.Add(tq, Occur.SHOULD); var c = new CollectorImpl(field, boost); syns.Search(new TermQuery(new Term(Syns2Index.F_WORD, word)), c); } return(tmp); }
/// <summary> /// Perform synonym expansion on a query. /// </summary> /// <param name="query">query</param> /// <param name="syns">syns</param> /// <param name="a">a</param> /// <param name="field">field</param> /// <param name="boost">boost</param> public static Query Expand(String query, Searcher syns, Analyzer a, String field, float boost) { already = new List<String>(); // avoid dups var top = new List<String>(); // needs to be separately listed.. var ts = a.TokenStream(field, new StringReader(query)); var termAtt = ts.AddAttribute<TermAttribute>(); while (ts.IncrementToken()) { var word = termAtt.Term; if (!already.Contains(word)) { already.Add(word); top.Add(word); } } tmp = new BooleanQuery(); // [2] form query System.Collections.IEnumerator it = top.GetEnumerator(); while (it.MoveNext()) { // [2a] add to level words in var word = (String)it.Current; var tq = new TermQuery(new Term(field, word)); tmp.Add(tq, Occur.SHOULD); var c = new CollectorImpl(field, boost); syns.Search(new TermQuery(new Term(Syns2Index.F_WORD, word)), c); } return tmp; }