Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
		/// <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;
		}