/// <summary>
        ///     Adds the query.
        /// </summary>
        /// <param name="fieldName">Name of the field.</param>
        /// <param name="query">The query.</param>
        /// <param name="filter">The filter.</param>
        protected void AddQuery(string fieldName, BooleanQuery query, StringCollection filter)
        {
            fieldName = fieldName.ToLower();
            if (filter.Count > 0)
            {
                if (filter.Count != 1)
                {
                    var booleanQuery = new BooleanQuery();
                    var containsFilter = false;
                    foreach (var index in filter)
                    {
                        if (String.IsNullOrEmpty(index))
                        {
                            continue;
                        }

                        var nodeQuery = new WildcardQuery(new Term(fieldName, index));
                        booleanQuery.Add(nodeQuery, Occur.SHOULD);
                        containsFilter = true;
                    }
                    if (containsFilter)
                    {
                        query.Add(booleanQuery, Occur.MUST);
                    }
                }
                else
                {
                    if (!String.IsNullOrEmpty(filter[0]))
                    {
                        this.AddQuery(fieldName, query, filter[0].ToLower());
                    }
                }
            }
        }
Exemple #2
0
        public int GetCount(string keyword, string field)
        {
            int    count     = 0;
            string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString();
            string typename  = ConfigurationManager.AppSettings["CRMMemberType"].ToString();

            //QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = type };
            //QueryContainer termQuery = new TermQuery { Field = type, Value = keyword };
            if (string.IsNullOrEmpty(field))
            {
                field = "_all";
            }
            else
            {
                field = field.ToLower();
            }
            //QueryContainer prefixQuery = new PrefixQuery { Field = field, Value = keyword };
            //QueryContainer matchQuery = new MatchQuery() { Field = field, Query = keyword, Operator = Operator.And };
            QueryContainer wildcardQuery = new WildcardQuery()
            {
                Field = field, Value = string.Format("*{0}*", keyword)
            };
            //调用仅取数量方法
            var counts = Connect.GetSearchClient().Count <Member>(s => s
                                                                  .Index(indexname)
                                                                  .Type(typename)
                                                                  .Query(wildcardQuery)
                                                                  );

            count = (int)counts.Count;
            return(count);
        }
        public Query CreateQuery(ILuceneQueryService builder, LuceneQueryContext context, string type, JObject query)
        {
            if (type != "wildcard")
            {
                return(null);
            }

            var first = query.Properties().First();

            switch (first.Value.Type)
            {
            case JTokenType.String:
                return(new WildcardQuery(new Term(first.Name, first.Value.ToString())));

            case JTokenType.Object:
                var obj = (JObject)first.Value;

                if (!obj.TryGetValue("value", out var value))
                {
                    throw new ArgumentException("Missing value in wildcard query");
                }

                var wildCardQuery = new WildcardQuery(new Term(value.Value <string>()));

                if (obj.TryGetValue("boost", out var boost))
                {
                    wildCardQuery.Boost = boost.Value <float>();
                }

                return(wildCardQuery);

            default: throw new ArgumentException("Invalid wildcard query");
            }
        }
        public virtual void TestTermWithoutWildcard()
        {
            var           indexStore = GetIndexStore("field", new System.String[] { "nowildcard", "nowildcardx" });
            IndexSearcher searcher   = new IndexSearcher(indexStore, true);

            MultiTermQuery wq = new WildcardQuery(new Term("field", "nowildcard"));

            AssertMatches(searcher, wq, 1);

            wq.RewriteMethod = MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE;
            wq.Boost         = 0.1f;
            Query q = searcher.Rewrite(wq);

            Assert.IsTrue(q is TermQuery);
            Assert.AreEqual(q.Boost, wq.Boost);

            wq.RewriteMethod = MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE;
            wq.Boost         = 0.2f;
            q = searcher.Rewrite(wq);
            Assert.IsTrue(q is ConstantScoreQuery);
            Assert.AreEqual(q.Boost, wq.Boost);

            wq.RewriteMethod = MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT;
            wq.Boost         = 0.3F;
            q = searcher.Rewrite(wq);
            Assert.IsTrue(q is ConstantScoreQuery);
            Assert.AreEqual(q.Boost, wq.Boost);

            wq.RewriteMethod = MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE;
            wq.Boost         = 0.4F;
            q = searcher.Rewrite(wq);
            Assert.IsTrue(q is ConstantScoreQuery);
            Assert.AreEqual(q.Boost, wq.Boost);
        }
        public virtual void TestAsterisk()
        {
            var           indexStore = GetIndexStore("body", new System.String[] { "metal", "metals" });
            IndexSearcher searcher   = new IndexSearcher(indexStore, true);
            Query         query1     = new TermQuery(new Term("body", "metal"));
            Query         query2     = new WildcardQuery(new Term("body", "metal*"));
            Query         query3     = new WildcardQuery(new Term("body", "m*tal"));
            Query         query4     = new WildcardQuery(new Term("body", "m*tal*"));
            Query         query5     = new WildcardQuery(new Term("body", "m*tals"));

            BooleanQuery query6 = new BooleanQuery();

            query6.Add(query5, Occur.SHOULD);

            BooleanQuery query7 = new BooleanQuery();

            query7.Add(query3, Occur.SHOULD);
            query7.Add(query5, Occur.SHOULD);

            // Queries do not automatically lower-case search terms:
            Query query8 = new WildcardQuery(new Term("body", "M*tal*"));

            AssertMatches(searcher, query1, 1);
            AssertMatches(searcher, query2, 2);
            AssertMatches(searcher, query3, 1);
            AssertMatches(searcher, query4, 2);
            AssertMatches(searcher, query5, 1);
            AssertMatches(searcher, query6, 1);
            AssertMatches(searcher, query7, 2);
            AssertMatches(searcher, query8, 0);
            AssertMatches(searcher, new WildcardQuery(new Term("body", "*tall")), 0);
            AssertMatches(searcher, new WildcardQuery(new Term("body", "*tal")), 1);
            AssertMatches(searcher, new WildcardQuery(new Term("body", "*tal*")), 2);
        }
        public void TestPrefixTerm()
        {
            var           indexStore = GetIndexStore("field", new String[] { "prefix", "prefixx" });
            IndexSearcher searcher   = new IndexSearcher(indexStore, true);

            MultiTermQuery wq = new WildcardQuery(new Term("field", "prefix*"));

            AssertMatches(searcher, wq, 2);

            MultiTermQuery expected = new PrefixQuery(new Term("field", "prefix"));

            wq.RewriteMethod       = MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE;
            wq.Boost               = 0.1F;
            expected.RewriteMethod = wq.RewriteMethod;
            expected.Boost         = wq.Boost;
            Assert.AreEqual(searcher.Rewrite(expected), searcher.Rewrite(wq));

            wq.RewriteMethod       = MultiTermQuery.CONSTANT_SCORE_FILTER_REWRITE;
            wq.Boost               = 0.2F;
            expected.RewriteMethod = wq.RewriteMethod;
            expected.Boost         = wq.Boost;
            Assert.AreEqual(searcher.Rewrite(expected), searcher.Rewrite(wq));

            wq.RewriteMethod       = MultiTermQuery.CONSTANT_SCORE_AUTO_REWRITE_DEFAULT;
            wq.Boost               = 0.3F;
            expected.RewriteMethod = wq.RewriteMethod;
            expected.Boost         = wq.Boost;
            Assert.AreEqual(searcher.Rewrite(expected), searcher.Rewrite(wq));

            wq.RewriteMethod       = MultiTermQuery.CONSTANT_SCORE_BOOLEAN_QUERY_REWRITE;
            wq.Boost               = 0.4F;
            expected.RewriteMethod = wq.RewriteMethod;
            expected.Boost         = wq.Boost;
            Assert.AreEqual(searcher.Rewrite(expected), searcher.Rewrite(wq));
        }
Exemple #7
0
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            WildcardQuery query = (WildcardQuery)value;

            if (query == null)
            {
                return;
            }

            /*
             * { "wildcard" : { "user" : { "wildcard" : "ki*y", "boost" : 2.0 } } }
             */

            writer.WriteStartObject();
            writer.WritePropertyName("wildcard");
            writer.WriteStartObject();
            writer.WritePropertyName(query.Field);
            writer.WriteStartObject();
            writer.WritePropertyName("wildcard");
            writer.WriteValue(query.Value);
            if (Math.Abs(query.Boost - Constants.DF_Boost) > 0)
            {
                writer.WritePropertyName("boost");
                writer.WriteValue(query.Boost);
            }
            writer.WriteEndObject();
            writer.WriteEndObject();
            writer.WriteEndObject();
        }
Exemple #8
0
        public override Query VisitWildcardQuery(WildcardQuery wildcardq)
        {
            var pattern = wildcardq.GetTerm().Text();

            if (pattern.Contains("?"))
            {
                throw new NotSupportedException("Cannot compile WildcardQuery, which contains '?', to SQL expression");
            }

            if (pattern.StartsWith("*") && pattern.EndsWith("*"))
            {
                _operators.Push("%LIKE%");
            }
            else if (pattern.StartsWith("*"))
            {
                _operators.Push("%LIKE");
            }
            else if (pattern.EndsWith("*"))
            {
                _operators.Push("LIKE%");
            }

            var q = base.VisitWildcardQuery(wildcardq);

            _operators.Pop();
            return(q);
        }
Exemple #9
0
        public List <Member> GetList(string keyword, string field, int start, int size)
        {
            string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString();
            string typename  = ConfigurationManager.AppSettings["CRMMemberType"].ToString();

            //QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = type};
            //QueryContainer termQuery = new TermQuery { Field = type, Value = keyword };
            if (string.IsNullOrEmpty(field))
            {
                field = "_all";
            }
            else
            {
                field = field.ToLower();
            }
            //QueryContainer prefixQuery = new PrefixQuery { Field = field, Value = keyword };
            //QueryContainer matchQuery = new MatchQuery() { Field = field, Query = keyword, Type = "phrase" };
            QueryContainer wildcardQuery = new WildcardQuery()
            {
                Field = field, Value = string.Format("*{0}*", keyword)
            };
            var searchResults = Connect.GetSearchClient().Search <Member>(s => s
                                                                          .Index(indexname)
                                                                          .Type(typename)
                                                                          .Query(wildcardQuery)
                                                                          //.Sort(st => st.OnField(f => f.newsid).Order(SortOrder.Descending))  /*按ID排序,id为数字,排序正常*/
                                                                          .From(start)
                                                                          .Size(size)
                                                                          );
            List <Member> eslist = new List <Member>(searchResults.Documents);

            return(eslist);
        }
Exemple #10
0
        /// <summary>
        /// Attempt to determine if a given query pattern contains whitespace and
        /// the analyzer does not tokenize on whitespace. This is a work-around
        /// for cases when QueryParser would split a keyword that contains whitespace
        /// into multiple tokens.
        /// </summary>
        protected virtual bool TryParseKeywordContainingWhitespace(string pattern, out Query query)
        {
            query = null;

            if (pattern.IndexOfAny(new[] { ' ', '\t', '\r', '\n' }) < 0)
            {
                return(false);
            }

            var terms = Analyzer.GetTerms(FieldName, pattern).ToList();

            if (terms.Count > 1)
            {
                return(false);
            }

            var termValue = Unescape(terms.Single());
            var term      = new Term(FieldName, termValue);

            if (IsWildcardPattern(termValue))
            {
                query = new WildcardQuery(term);
            }
            else
            {
                query = new TermQuery(term);
            }

            return(true);
        }
Exemple #11
0
        /// <summary>
        /// Builds a new <see cref="WildcardQuery"/> instance
        /// </summary>
        /// <param name="t">wildcard term</param>
        /// <returns>new <see cref="WildcardQuery"/> instance</returns>
        protected internal virtual Query NewWildcardQuery(Term t)
        {
            WildcardQuery query = new WildcardQuery(t);

            query.MultiTermRewriteMethod = MultiTermRewriteMethod;
            return(query);
        }
Exemple #12
0
        public override Query VisitWildcardQuery(WildcardQuery wildcardq)
        {
            _text.Append(TermToString(wildcardq.GetTerm()));
            _text.Append(BoostToString(wildcardq.GetBoost()));

            return(base.VisitWildcardQuery(wildcardq));
        }
Exemple #13
0
 public static WildcardQuery BuildWildcardQuery(Aliyun.OTS.DataModel.Search.Query.WildcardQuery query)
 {
     WildcardQuery.Builder builder = WildcardQuery.CreateBuilder();
     builder.SetFieldName(query.FieldName);
     builder.SetValue(query.Value);
     return(builder.Build());
 }
Exemple #14
0
        public override void TestEscapedWildcard()
        {
            ICommonQueryParserConfiguration qp = GetParserConfig(new MockAnalyzer(Random, MockTokenizer.WHITESPACE, false));
            WildcardQuery q = new WildcardQuery(new Term("field", "foo?ba?r"));//TODO not correct!!

            assertEquals(q, GetQuery("foo\\?ba?r", qp));
        }
        public void InitializerTypedTests()
        {
            QueryContainer boolQuery =
                new WildcardQuery<ElasticsearchProject>(p => p.Name)
                {
                    Value = "value",
                    Rewrite = RewriteMultiTerm.constant_score_boolean
                }
                && new WildcardQuery
                {
                    Field = "my_other_prefix_field",
                    Value = "value"
                };
            var searchRequest = new SearchRequest()
            {
                Query = boolQuery
            };

            var search = this._client.Search<ElasticsearchProject>(searchRequest);

            var request = search.RequestInformation.Request.Utf8String();
            request.Should().Contain("name");
            request.Should().Contain("my_other_prefix_field");
            Assert.Pass(request);
        }
Exemple #16
0
        internal static WildcardQuery GetLuceneWildcardSearchQuery(String fieldName, String searchPattern)
        {
            var term  = new Term(fieldName, searchPattern);
            var query = new WildcardQuery(term);

            return(query);
        }
        public virtual void TestNoSuchMultiTermsInSpanFirst()
        {
            //this hasn't been a problem
            FuzzyQuery fuzzyNoSuch = new FuzzyQuery(new Term("field", "noSuch"), 1, 0, 1, false);
            SpanQuery  spanNoSuch  = new SpanMultiTermQueryWrapper <MultiTermQuery>(fuzzyNoSuch);
            SpanQuery  spanFirst   = new SpanFirstQuery(spanNoSuch, 10);

            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);

            WildcardQuery wcNoSuch     = new WildcardQuery(new Term("field", "noSuch*"));
            SpanQuery     spanWCNoSuch = new SpanMultiTermQueryWrapper <MultiTermQuery>(wcNoSuch);

            spanFirst = new SpanFirstQuery(spanWCNoSuch, 10);
            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);

            RegexpQuery rgxNoSuch     = new RegexpQuery(new Term("field", "noSuch"));
            SpanQuery   spanRgxNoSuch = new SpanMultiTermQueryWrapper <MultiTermQuery>(rgxNoSuch);

            spanFirst = new SpanFirstQuery(spanRgxNoSuch, 10);
            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);

            PrefixQuery prfxNoSuch     = new PrefixQuery(new Term("field", "noSuch"));
            SpanQuery   spanPrfxNoSuch = new SpanMultiTermQueryWrapper <MultiTermQuery>(prfxNoSuch);

            spanFirst = new SpanFirstQuery(spanPrfxNoSuch, 10);
            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);
        }
Exemple #18
0
        private static Query ParseQuery(SearchFilter searchFilter)
        {
            if (String.IsNullOrWhiteSpace(searchFilter.SearchTerm))
            {
                return(new MatchAllDocsQuery());
            }

            var fields      = new[] { "Id", "Title", "Tags", "Description", "Author" };
            var analyzer    = new StandardAnalyzer(LuceneCommon.LuceneVersion);
            var queryParser = new MultiFieldQueryParser(LuceneCommon.LuceneVersion, fields, analyzer);

            // All terms in the multi-term query appear in at least one of the fields.
            var conjuctionQuery = new BooleanQuery();

            conjuctionQuery.SetBoost(2.0f);

            // Some terms in the multi-term query appear in at least one of the fields.
            var disjunctionQuery = new BooleanQuery();

            disjunctionQuery.SetBoost(0.1f);

            // Suffix wildcard search e.g. jquer*
            var wildCardQuery = new BooleanQuery();

            wildCardQuery.SetBoost(0.5f);

            // Escape the entire term we use for exact searches.
            var escapedSearchTerm = Escape(searchFilter.SearchTerm);
            var exactIdQuery      = new TermQuery(new Term("Id-Exact", escapedSearchTerm));

            exactIdQuery.SetBoost(2.5f);
            var wildCardIdQuery = new WildcardQuery(new Term("Id-Exact", "*" + escapedSearchTerm + "*"));

            foreach (var term in GetSearchTerms(searchFilter.SearchTerm))
            {
                var termQuery = queryParser.Parse(term);
                conjuctionQuery.Add(termQuery, BooleanClause.Occur.MUST);
                disjunctionQuery.Add(termQuery, BooleanClause.Occur.SHOULD);

                foreach (var field in fields)
                {
                    var wildCardTermQuery = new WildcardQuery(new Term(field, term + "*"));
                    wildCardTermQuery.SetBoost(0.7f);
                    wildCardQuery.Add(wildCardTermQuery, BooleanClause.Occur.SHOULD);
                }
            }

            // Create an OR of all the queries that we have
            var combinedQuery =
                conjuctionQuery.Combine(new Query[] { exactIdQuery, wildCardIdQuery, conjuctionQuery, disjunctionQuery, wildCardQuery });

            if (searchFilter.SortProperty == SortProperty.Relevance)
            {
                // If searching by relevance, boost scores by download count.
                var downloadCountBooster = new FieldScoreQuery("DownloadCount", FieldScoreQuery.Type.INT);
                return(new CustomScoreQuery(combinedQuery, downloadCountBooster));
            }
            return(combinedQuery);
        }
Exemple #19
0
        public IEnumerable <SearchResult> GetSearchResults(string queryText, int maxResults = 10)
        {
            queryText = queryText.ToLower();
            using (var directory = FSDirectory.Open(new DirectoryInfo(this.AppSettings.SearchIndexesDirectoryPath)))
            {
                var reader      = DirectoryReader.Open(directory);
                var searcher    = new IndexSearcher(reader);
                var queryParser = new QueryParser(Lucene.Net.Util.LuceneVersion.LUCENE_48, "text", GetAnalyzer());

                queryParser.AllowLeadingWildcard = true;
                queryParser.DefaultOperator      = Operator.AND;

                var fullQuery = new BooleanQuery();
                //wrap every term so that we do exact match, fuzzy match, and wildcard match
                {
                    var parsedQuery = queryParser.Parse(queryText);
                    parsedQuery = parsedQuery.Rewrite(reader);

                    var terms = new HashSet <Term>();
                    parsedQuery.ExtractTerms(terms);


                    //for every term, create a boolean query that includes exact match, fuzzy match and wildcard match
                    foreach (var term in terms)
                    {
                        var subquery = new BooleanQuery();
                        var text     = term.Text();

                        //add the initial term
                        subquery.Add(new TermQuery(term), Occur.SHOULD);

                        //TODO - remove permanently if this fixes the search issues
                        // var fuzzyQuery = new FuzzyQuery(new Term(term.Field, term.Text()));
                        // fuzzyQuery.Boost = 0.5f;
                        // subquery.Add(fuzzyQuery, Occur.SHOULD);

                        var wildQuery = new WildcardQuery(new Term(term.Field, $"*{term.Text()}*"));
                        wildQuery.Boost = 0.1f;
                        subquery.Add(wildQuery, Occur.SHOULD);

                        fullQuery.Add(subquery, Occur.MUST);
                    }
                }

                var hits        = searcher.Search(fullQuery, maxResults);
                var returnValue = new List <SearchResult>();
                foreach (var hit in hits.ScoreDocs)
                {
                    var resultDoc    = searcher.Doc(hit.Doc);
                    var id           = resultDoc.GetField("id").GetInt32Value().Value;
                    var searchResult = new SearchResult()
                    {
                        MediaItemId = id
                    };
                    returnValue.Add(searchResult);
                }
                return(returnValue);
            }
        }
 public virtual void TestPrefix()
 {
     WildcardQuery wq = new WildcardQuery(new Term("field", "extrem*"));
     SpanQuery swq = new SpanMultiTermQueryWrapper<MultiTermQuery>(wq);
     // will only match "jumps over extremely very lazy broxn dog"
     SpanFirstQuery sfq = new SpanFirstQuery(swq, 3);
     Assert.AreEqual(1, Searcher.Search(sfq, 10).TotalHits);
 }
Exemple #21
0
 public virtual void TestPrefix()
 {
     WildcardQuery wq = new WildcardQuery(new Term("field", "extrem*"));
     SpanQuery swq = new SpanMultiTermQueryWrapper<MultiTermQuery>(wq);
     // will only match "jumps over extremely very lazy broxn dog"
     SpanFirstQuery sfq = new SpanFirstQuery(swq, 3);
     Assert.AreEqual(1, searcher.Search(sfq, 10).TotalHits);
 }
 public virtual void TestWildcard()
 {
     WildcardQuery wq = new WildcardQuery(new Term("field", "bro?n"));
     SpanQuery swq = new SpanMultiTermQueryWrapper<MultiTermQuery>(wq);
     // will only match quick brown fox
     SpanFirstQuery sfq = new SpanFirstQuery(swq, 2);
     Assert.AreEqual(1, Searcher.Search(sfq, 10).TotalHits);
 }
Exemple #23
0
 public virtual void TestWildcard()
 {
     WildcardQuery wq = new WildcardQuery(new Term("field", "bro?n"));
     SpanQuery swq = new SpanMultiTermQueryWrapper<MultiTermQuery>(wq);
     // will only match quick brown fox
     SpanFirstQuery sfq = new SpanFirstQuery(swq, 2);
     Assert.AreEqual(1, searcher.Search(sfq, 10).TotalHits);
 }
        public List <Hit> GetEmailResults(StringDictionary queryDic)
        {
            try
            {
                List <Hit> results = new List <Hit>();

                IndexSearcher ids = new IndexSearcher(GlobalData.EmailIndexPath);
                //Iterate over all the properties involved in the query
                foreach (string property in queryDic.Keys)
                {
                    Query q = null;

                    #region Based on the property to be indexed, Create the necessary Analyser
                    switch (property)
                    {
                    case "body":
                    {
                        q = new QueryParser(property, new KeywordAnalyzer()).Parse(queryDic[property]);
                    }
                    break;

                    case "date":
                    {
                        int    idx;
                        string from, to;
                        idx  = queryDic[property].IndexOf(' ');
                        from = queryDic[property].Substring(0, idx);
                        to   = queryDic[property].Substring(idx + 1);
                        q    = new RangeQuery(new Term(property, from), new Term(property, to), true);
                    }
                    break;

                    default:
                        if (queryDic[property].Contains("*") || queryDic[property].Contains("?"))
                        {
                            q = new WildcardQuery(new Term(property, queryDic[property]));
                        }
                        else
                        {
                            //  PerFieldAnalyzerWrapper pfaw = new PerFieldAnalyzerWrapper();
                            q = new QueryParser(property, new KeywordAnalyzer()).Parse(queryDic[property]);
                        }
                        break;
                    }
                    #endregion

                    //Get the results
                    Hits hits = ids.Search(q);
                    foreach (Hit hit in hits)
                    {
                        results.Add(hit); //Add the results to a List
                    }
                }
                // ids.Close();
                return(results);//Return the list
            }
            catch { return(null); }
        }
Exemple #25
0
            private int BuildIndexToDocIdMap(IndexReader indexReader, out List <Tuple <int, int> > indexToDocIdMapping)
            {
                // The problem is, we want to access the list of files given a consecutive file index number, but there are gaps in the doc-ids caused by tag documents
                //
                // DocId  0 Tag
                // DocId  1 File => Index 0
                // DocId  2 Tag
                // DocId  3 Tag
                // DocId  4 File => Index 1
                // DocId  5 File => Index 2
                // DocId  6 File => Index 3
                // DocId  7 Tag
                // DocId  8 Tag
                // DocId  9 Tag
                // DocId 10 File => Index 4
                // DocId 11 Tag
                // DocId 12 Tag
                // ............  => Index 5
                // Therfore we construct a list of index to docId tuples, which can be searched using binary search in order to map the index to the corresponding doc id.

                indexToDocIdMapping = new List <Tuple <int, int> >();
                using (var indexSearcher = new IndexSearcher(indexReader))
                {
                    var tagQuery = new WildcardQuery(new Term(FIELD_TAG, "*"));
                    var tagDocs  = indexSearcher.Search(tagQuery, mIndex.mIndexReader.NumDocs()).ScoreDocs;
                    if (tagDocs.Length > 0)
                    {
                        // Ensure docids are sorted in ascending order, such that they are consecutive too
                        Array.Sort(tagDocs, (x, y) => x.Doc - y.Doc);

                        var docId     = tagDocs[0].Doc;
                        int maxGapId  = -1;
                        int baseIndex = 0;

                        // Sweep and detect gaps...
                        for (int i = 0; i < tagDocs.Length; ++i)
                        {
                            docId = tagDocs[i].Doc;
                            if (docId - maxGapId > 1)
                            {
                                // Gap => emit mapping
                                indexToDocIdMapping.Add(new Tuple <int, int>(baseIndex, maxGapId + 1));
                                baseIndex += docId - (maxGapId + 1);
                                maxGapId   = docId;
                            }
                            else
                            {
                                maxGapId = docId;
                            }
                        }

                        // Emit last mapping
                        indexToDocIdMapping.Add(new Tuple <int, int>(baseIndex, maxGapId + 1));
                    }
                    return(tagDocs.Length);
                }
            }
Exemple #26
0
        private BsonDocument VisitWilcard(WildcardQuery wildcardQuery)
        {
            var doc = CreateDefaultDoc(wildcardQuery, wildcardQuery.Term);

            return(new BsonDocument
            {
                ["wildcard"] = doc
            });
        }
Exemple #27
0
        public override Query VisitWildcardQuery(WildcardQuery wildcardq)
        {
            _dump.Append("WildcardQ(");
            var q = base.VisitWildcardQuery(wildcardq);

            _dump.Append(BoostToString(q));
            _dump.Append(")");
            return(q);
        }
Exemple #28
0
        public override Query VisitWildcardQuery(WildcardQuery wildcardq)
        {
#pragma warning disable CS0618 // Type or member is obsolete
            _text.Append(TermToString(wildcardq.GetTerm()));
#pragma warning restore CS0618 // Type or member is obsolete
            _text.Append(BoostToString(wildcardq.GetBoost()));

            return(base.VisitWildcardQuery(wildcardq));
        }
Exemple #29
0
        public static void WildcardQueryTest(Analyzer analyzer, string field, string keyword)
        {
            Console.WriteLine("====WildcardQuery====");
            WildcardQuery query = new WildcardQuery(new Term(field, keyword));

            ShowQueryExpression(analyzer, query, keyword);
            SearchToShow(query);
            Console.WriteLine();
        }
Exemple #30
0
        public virtual Query VisitWildcardQuery(WildcardQuery wildcardq)
        {
#pragma warning disable CS0618 // Type or member is obsolete
            var term = wildcardq.GetTerm();
#pragma warning restore CS0618 // Type or member is obsolete
            var visited = VisitTerm(term);
            if (term == visited)
                return wildcardq;
            return new WildcardQuery(visited);
        }
Exemple #31
0
        private ParameterizedSql BuildWildcard(WildcardQuery wildcardQuery)
        {
            Term term = CopyTerm(wildcardQuery.Term);

            if (term != null)
            {
                return(BuildQuery(new WildcardQuery(term)));
            }

            return(null);
        }
Exemple #32
0
        public virtual Query VisitWildcardQuery(WildcardQuery wildcardq)
        {
            var term    = wildcardq.GetTerm();
            var visited = VisitTerm(term);

            if (term == visited)
            {
                return(wildcardq);
            }
            return(new WildcardQuery(visited));
        }
        public void TestConstantSocreWithWildQuery()
        {
            var query  = new WildcardQuery("name","张*");

            var constanQuery = new ConstantScoreQuery(query);
            
            var result = client.Search(index, "type" , constanQuery, 0, 5);
            
            Assert.AreEqual(3, result.GetTotalCount());
            Assert.AreEqual(3, result.GetHits().Hits.Count);
        }    
        public void Export_Omits_Field_If_Not_Provided()
        {
            var query = new WildcardQuery("wildcard");

            var expected = JsonConvert.SerializeObject(new
            {
                wildcard = "wildcard"
            }, Formatting.None);

            Assert.Equal(expected, query.Export().ToString(Formatting.None));
        }
        public void TestWildcards()
        {
            Directory dir = NewDirectory();
            // use simpleanalyzer for more natural tokenization (else "test." is a token)
            Analyzer          analyzer = new MockAnalyzer(Random, MockTokenizer.SIMPLE, true);
            IndexWriterConfig iwc      = NewIndexWriterConfig(TEST_VERSION_CURRENT, analyzer);

            iwc.SetMergePolicy(NewLogMergePolicy());
            RandomIndexWriter iw = new RandomIndexWriter(Random, dir, iwc);

            FieldType offsetsType = new FieldType(TextField.TYPE_STORED);

            offsetsType.IndexOptions = (IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS);
            Field    body = new Field("body", "", offsetsType);
            Document doc  = new Document();

            doc.Add(body);

            body.SetStringValue("This is a test.");
            iw.AddDocument(doc);
            body.SetStringValue("Test a one sentence document.");
            iw.AddDocument(doc);

            IndexReader ir = iw.GetReader();

            iw.Dispose();

            IndexSearcher          searcher    = NewSearcher(ir);
            ICUPostingsHighlighter highlighter = new PostingsHighlighterAnalyzerHelper(analyzer);
            Query   query   = new WildcardQuery(new Term("body", "te*"));
            TopDocs topDocs = searcher.Search(query, null, 10, Sort.INDEXORDER);

            assertEquals(2, topDocs.TotalHits);
            String[] snippets = highlighter.Highlight("body", query, searcher, topDocs);
            assertEquals(2, snippets.Length);
            assertEquals("This is a <b>test</b>.", snippets[0]);
            assertEquals("<b>Test</b> a one sentence document.", snippets[1]);

            // wrong field
            BooleanQuery bq = new BooleanQuery();

            bq.Add(new MatchAllDocsQuery(), Occur.SHOULD);
            bq.Add(new WildcardQuery(new Term("bogus", "te*")), Occur.SHOULD);
            topDocs = searcher.Search(bq, null, 10, Sort.INDEXORDER);
            assertEquals(2, topDocs.TotalHits);
            snippets = highlighter.Highlight("body", bq, searcher, topDocs);
            assertEquals(2, snippets.Length);
            assertEquals("This is a test.", snippets[0]);
            assertEquals("Test a one sentence document.", snippets[1]);

            ir.Dispose();
            dir.Dispose();
        }
		public void InitializerTests()
		{
			QueryContainer wildcardQuery = new WildcardQuery
			{
				Field = "my_prefix_field",
				Value = "value",
				Rewrite = RewriteMultiTerm.ConstantScoreBoolean
			};
			var searchRequest = new SearchRequest()
			{
				Query = wildcardQuery
			};

			var search = this._client.Search<ElasticsearchProject>(searchRequest);

			var request = search.RequestInformation.Request.Utf8String();
			request.Should().Contain("my_prefix_field");
			Assert.Pass(request);
		}
Exemple #37
0
 public int GetCount(string keyword,string field)
 {
     int count = 0;
     string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString();
     string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString();
     //QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = type };
     //QueryContainer termQuery = new TermQuery { Field = type, Value = keyword };
     if (string.IsNullOrEmpty(field))
     { field = "_all"; }
     else { field = field.ToLower(); }
     //QueryContainer prefixQuery = new PrefixQuery { Field = field, Value = keyword };
     //QueryContainer matchQuery = new MatchQuery() { Field = field, Query = keyword, Operator = Operator.And };
     QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.Format("*{0}*", keyword) };
     //调用仅取数量方法
     var counts = Connect.GetSearchClient().Count<Member>(s => s
         .Index(indexname)
         .Type(typename)
         .Query(wildcardQuery)
     );
     count = (int)counts.Count;
     return count;
 }
Exemple #38
0
        public int GetCountByM(SearchCondition sc)
        {
            int count = 0;
            string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString();
            string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString();
            string field = "";
            if (string.IsNullOrEmpty(sc.field))
            { field = ""; }
            else { field = sc.field.ToLower(); }
            string classVaule = "";
            if (string.IsNullOrEmpty(sc.classx))
            {
                sc.classx = "";
            }
            else
            {
                sc.classx = sc.classx.ToLower();
                classVaule = "1";
            }

            //must
            List<QueryContainer> mustquerys = new List<QueryContainer>();
            if (field.Equals("lastcontacttime"))
            {
                string timeG = sc.keywords[0];
                string timeL = DateTime.Parse(timeG).AddDays(-7).ToString("yyyy-MM-dd");
                QueryContainer rangeQuyery = new RangeQuery() { Field = field, GreaterThanOrEqualTo = timeL, LowerThanOrEqualTo = timeG, TimeZone = "+08:00" };
                mustquerys.Add(rangeQuyery);
            }
            else if (field.Equals("enterprise"))
            {

                foreach (string keyw in sc.keywords)
                {
                    List<QueryContainer> shouooo = new List<QueryContainer>();
                    QueryContainer termQ = new TermQuery() { Field = "enterprise", Value = sc.keyword.Replace(',', ' ') };
                    QueryContainer lowerQuery = new WildcardQuery() { Field = "enterprise", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) };
                    QueryContainer notlowerQuery = new WildcardQuery() { Field = "enterprise.lower", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) };
                    shouooo.Add(termQ);
                    shouooo.Add(lowerQuery);
                    shouooo.Add(notlowerQuery);
                    QueryContainer boooQuery = new BoolQuery() { Should = shouooo };
                    mustquerys.Add(boooQuery);
                }
            }
            else
            {
                foreach (string keyw in sc.keywords)
                {
                    QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw) };
                    mustquerys.Add(wildcardQuery);
                }
            }

            QueryContainer matchQueryT = new MatchQuery() { Field = "tracktypeid", Query = Convert.ToString(sc.tracktype) };
            QueryContainer matchQueryC = new MatchQuery() { Field = sc.classx, Query = classVaule };
            QueryContainer queryCountry = new WildcardQuery() { Field = "country", Value = string.Format("*{0}*", sc.country) };
            QueryContainer queryProvince = new WildcardQuery() { Field = "province", Value = string.Format("*{0}*", sc.province) };
            QueryContainer queryCity = new WildcardQuery() { Field = "city", Value = string.Format("*{0}*", sc.city) };
            if (!string.IsNullOrEmpty(sc.tracktype))
            {
                mustquerys.Add(matchQueryT);
            }
            if (!string.IsNullOrEmpty(sc.classx))
            {
                mustquerys.Add(matchQueryC);
            }
            if (!string.IsNullOrEmpty(sc.country))
            {
                mustquerys.Add(queryCountry);
            }
            if (!string.IsNullOrEmpty(sc.province))
            {
                mustquerys.Add(queryProvince);
            }
            if (!string.IsNullOrEmpty(sc.city))
            {
                mustquerys.Add(queryCity);
            }
            QueryContainer boolQuery = new BoolQuery() { Must = mustquerys };
            //QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.IsNullOrEmpty(sc.keyword) ? "*" : string.Format("*{0}*", sc.keyword) };
            var searchResults = Connect.GetSearchClient().Count<Member>(s => s
                .Index(indexname)
                .Type(typename)
                .Query(boolQuery)
            );
            count = (int)searchResults.Count;
            return count;
        }
Exemple #39
0
        static IEnumerable<WildcardQuery> BuildWildCardQueries(IndexSearcher aSearcher, string[] aTerms, Int64 aSize, bool aShowOfflineBots, int aStart, int aLimit)
        {
            var queries = new List<WildcardQuery>();

            int count = 0;
            int missing = aLimit;
            foreach (string term in aTerms)
            {
                var query = BuildQuery(term, aSize, aShowOfflineBots);
                var total = GetTotalResults(aSearcher, query);
                if (total > 0)
                {
                    var wq = new WildcardQuery { Enabled = true, Query = query, Term = term, Total = total };

                    if (count + total <= aStart || missing == 0)
                    {
                        wq.Enabled = false;
                    }
                    else
                    {
                        wq.Start = aStart > count ? aStart - count : 0;
                        if (wq.Total - wq.Start >= missing)
                        {
                            wq.Limit = missing;
                            missing = 0;
                        }
                        else
                        {
                            wq.Limit = wq.Total - wq.Start;
                            missing -= wq.Limit;
                        }
                    }

                    queries.Add(wq);
                    count += wq.Total;
                }
            }

            return queries;
        }
		public SpanMultiQuery(WildcardQuery query)
		{
			_query = query;
		}
Exemple #41
0
        /// <summary>
        /// WEBAPI使用方法,直接获取Member
        /// </summary>
        /// <param name="sc"></param>
        /// <param name="em"></param>
        /// <returns></returns>
        public string GetMember(SearchCondition sc, out int em)
        {
            string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString();
            string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString();
            string field = "";
            if (string.IsNullOrEmpty(sc.field))
            { field = ""; }
            else { field = sc.field.ToLower(); }
            string classVaule = "";
            if (string.IsNullOrEmpty(sc.classx))
            {
                sc.classx = "";
            }
            else
            {
                sc.classx = sc.classx.ToLower();
                classVaule = "1";
            }
            //must
            List<QueryContainer> mustquerys = new List<QueryContainer>();

            if (field.Equals("lastcontacttime"))
            {
                string timeG = sc.keywords[0];
                string timeL = DateTime.Parse(timeG).AddDays(-7).ToString("yyyy-MM-dd");
                QueryContainer rangeQuyery = new RangeQuery() { Field = field, GreaterThanOrEqualTo = timeL, LowerThanOrEqualTo = timeG, TimeZone = "+08:00" };
                mustquerys.Add(rangeQuyery);
            }
            else if (field.Equals("enterprise"))
            {
                foreach (string keyw in sc.keywords)
                {
                    List<QueryContainer> shouooo = new List<QueryContainer>();
                    QueryContainer termQ = new TermQuery() { Field = "enterprise", Value = sc.keyword.Replace(',', ' ') };
                    QueryContainer lowerQuery = new WildcardQuery() { Field = "enterprise", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) };
                    QueryContainer notlowerQuery = new WildcardQuery() { Field = "enterprise.lower", Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw.ToLower()) };
                    shouooo.Add(termQ);
                    shouooo.Add(lowerQuery);
                    shouooo.Add(notlowerQuery);
                    QueryContainer boooQuery = new BoolQuery() { Should = shouooo };
                    mustquerys.Add(boooQuery);
                }
            }
            else
            {
                foreach (string keyw in sc.keywords)
                {
                    QueryContainer wildcardQuery = new WildcardQuery() { Field = field, Value = string.IsNullOrEmpty(keyw) ? "*" : string.Format("*{0}*", keyw) };
                    mustquerys.Add(wildcardQuery);
                }
            }
            QueryContainer matchQueryT = new MatchQuery() { Field = "tracktypeid", Query = Convert.ToString(sc.tracktype) };
            QueryContainer matchQueryC = new MatchQuery() { Field = sc.classx, Query = classVaule };
            QueryContainer queryCountry = new WildcardQuery() { Field = "country", Value = string.Format("*{0}*", sc.country) };
            QueryContainer queryProvince = new WildcardQuery() { Field = "province", Value = string.Format("*{0}*", sc.province) };
            QueryContainer queryCity = new WildcardQuery() { Field = "city", Value = string.Format("*{0}*", sc.city) };
            if (!string.IsNullOrEmpty(sc.tracktype))
            {
                mustquerys.Add(matchQueryT);
            }
            if (!string.IsNullOrEmpty(sc.classx))
            {
                mustquerys.Add(matchQueryC);
            }
            if (!string.IsNullOrEmpty(sc.country))
            {
                mustquerys.Add(queryCountry);
            }
            if (!string.IsNullOrEmpty(sc.province))
            {
                mustquerys.Add(queryProvince);
            }
            if (!string.IsNullOrEmpty(sc.city))
            {
                mustquerys.Add(queryCity);
            }
            QueryContainer boolQuery = new BoolQuery() { Must = mustquerys };

            var searchResults = Connect.GetSearchClient().Search<Member>(s => s
                 .Index(indexname)
                 .Type(typename)
                 .Fields(f => f.Id, f => f.Enterprise, f => f.Isstar, f => f.Masterlinkman, f => f.Tracktypeid, f => f.Sourceid, f => f.Lastcontacttime, f => f.Enddate, f => f.Adminname, f => f.Addtime)
                 .Query(boolQuery)
                 .Sort(st => st.OnField(f => f.Lastcontacttime).Order(SortOrder.Descending))  /*排序*/
                 .From(sc.start)
                 .Size(sc.size)
             );
            em = searchResults.ElapsedMilliseconds;
            StringBuilder ResultJson = new StringBuilder("");
            ResultJson.Append("[");
            foreach (var hit in searchResults.Hits)
            {
                ResultJson.Append("{");
                ResultJson.Append(
                    String.Join(",",
                        hit.Fields.FieldValuesDictionary
                            .Select(FVD => "'" + FVD.Key + "':'" + FVD.Value.ToString().Replace("[", "").Replace("]", "") + "'")
                            .ToArray()
                    )
                );
                ResultJson.Append("},");
            }
            if (ResultJson.Length > 1)
                ResultJson.Length = ResultJson.Length - 1;
            ResultJson.Append("]");
            return ResultJson.ToString();
        }
 /// <summary>
 ///     Adds the query.
 /// </summary>
 /// <param name="fieldName">Name of the field.</param>
 /// <param name="query">The query.</param>
 /// <param name="filter">The filter.</param>
 protected void AddQuery(string fieldName, BooleanQuery query, string filter)
 {
     fieldName = fieldName.ToLower();
     var nodeQuery = new WildcardQuery(new Term(fieldName, filter.ToLower()));
     query.Add(nodeQuery, Occur.MUST);
 }
Exemple #43
0
 public List<Member> GetList(string keyword, string field, int start, int size)
 {
     string indexname = ConfigurationManager.AppSettings["CRMIndex"].ToString();
     string typename = ConfigurationManager.AppSettings["CRMMemberType"].ToString();
     //QueryContainer query = new QueryStringQuery() { Query = keyword, DefaultOperator = Operator.Or, DefaultField = type};
     //QueryContainer termQuery = new TermQuery { Field = type, Value = keyword };
     if (string.IsNullOrEmpty(field))
     { field = "_all"; }
     else { field = field.ToLower(); }
     //QueryContainer prefixQuery = new PrefixQuery { Field = field, Value = keyword };
     //QueryContainer matchQuery = new MatchQuery() { Field = field, Query = keyword, Type = "phrase" };
     QueryContainer wildcardQuery = new WildcardQuery() {Field = field ,Value = string.Format("*{0}*", keyword) };
     var searchResults = Connect.GetSearchClient().Search<Member>(s => s
         .Index(indexname)
         .Type(typename)
         .Query(wildcardQuery)
         //.Sort(st => st.OnField(f => f.newsid).Order(SortOrder.Descending))  /*按ID排序,id为数字,排序正常*/
         .From(start)
         .Size(size)
     );
     List<Member> eslist = new List<Member>(searchResults.Documents);
     return eslist;
 }
        public void TestFilterdQuery()
        {

            var termQuery = new TermQuery("type", "common");
            var termFilter = new TermFilter("age", "24");
            var filteredQuery = new FilteredQuery(termQuery,termFilter);
            var result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);

            var wildQuery = new WildcardQuery("name", "张三*");
            termFilter = new TermFilter("age", "23");
            filteredQuery = new FilteredQuery(wildQuery, termFilter);
            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三丰",result2.GetHits().Hits[0].Source["name"]);


            var boolQuery = new BoolQuery();
            boolQuery.Must(new TermQuery("type", "common"));
            boolQuery.Must(new WildcardQuery("name", "张三*"));
            boolQuery.Should(new TermQuery("age", 24));

            filteredQuery=new FilteredQuery(boolQuery,new TermFilter("age","23"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三丰", result2.GetHits().Hits[0].Source["name"]);



            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("age", "24"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三", result2.GetHits().Hits[0].Source["name"]);


            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(2, result2.GetTotalCount());
            Assert.AreEqual(2, result2.GetHits().Hits.Count);

            
            //test should

            boolQuery = new BoolQuery();
            boolQuery.Must(new TermQuery("type", "common"));
            boolQuery.Must(new WildcardQuery("name", "张*"));
            boolQuery.Should(new TermQuery("age", 24));

            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(3, result2.GetTotalCount());
            Assert.AreEqual(3, result2.GetHits().Hits.Count);

            boolQuery = new BoolQuery();
            boolQuery.Must(new TermQuery("type", "common"));
            boolQuery.Must(new WildcardQuery("name", "张*"));
            boolQuery.Should(new TermQuery("age", 24));
            boolQuery.Should(new TermQuery("age", 28));
            boolQuery.Should(new TermQuery("age", 22));
            //must+should ->[should] make nonsense
            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(3, result2.GetTotalCount());
            Assert.AreEqual(3, result2.GetHits().Hits.Count);


            boolQuery = new BoolQuery();
            boolQuery.Should(new TermQuery("age", 24));
            boolQuery.Should(new TermQuery("age", 28));
            boolQuery.Should(new TermQuery("age", 22));
            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(1, result2.GetTotalCount());
            Assert.AreEqual(1, result2.GetHits().Hits.Count);
            Assert.AreEqual("张三", result2.GetHits().Hits[0].Source["name"]);


            boolQuery.Should(new TermQuery("age", 25));
            filteredQuery = new FilteredQuery(boolQuery, new TermFilter("type", "common"));

            result2 = client.Search(index, "type" , filteredQuery, 0, 5);
            Assert.AreEqual(2, result2.GetTotalCount());
            Assert.AreEqual(2, result2.GetHits().Hits.Count);
        }
        public virtual void TestNoSuchMultiTermsInOr()
        {
            //test to make sure non existent multiterms aren't throwing null pointer exceptions
            FuzzyQuery fuzzyNoSuch = new FuzzyQuery(new Term("field", "noSuch"), 1, 0, 1, false);
            SpanQuery spanNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(fuzzyNoSuch);
            SpanQuery term = new SpanTermQuery(new Term("field", "brown"));
            SpanOrQuery near = new SpanOrQuery(new SpanQuery[] { term, spanNoSuch });
            Assert.AreEqual(1, Searcher.Search(near, 10).TotalHits);

            //flip
            near = new SpanOrQuery(new SpanQuery[] { spanNoSuch, term });
            Assert.AreEqual(1, Searcher.Search(near, 10).TotalHits);

            WildcardQuery wcNoSuch = new WildcardQuery(new Term("field", "noSuch*"));
            SpanQuery spanWCNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(wcNoSuch);
            near = new SpanOrQuery(new SpanQuery[] { term, spanWCNoSuch });
            Assert.AreEqual(1, Searcher.Search(near, 10).TotalHits);

            RegexpQuery rgxNoSuch = new RegexpQuery(new Term("field", "noSuch"));
            SpanQuery spanRgxNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(rgxNoSuch);
            near = new SpanOrQuery(new SpanQuery[] { term, spanRgxNoSuch });
            Assert.AreEqual(1, Searcher.Search(near, 10).TotalHits);

            PrefixQuery prfxNoSuch = new PrefixQuery(new Term("field", "noSuch"));
            SpanQuery spanPrfxNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(prfxNoSuch);
            near = new SpanOrQuery(new SpanQuery[] { term, spanPrfxNoSuch });
            Assert.AreEqual(1, Searcher.Search(near, 10).TotalHits);

            near = new SpanOrQuery(new SpanQuery[] { spanPrfxNoSuch });
            Assert.AreEqual(0, Searcher.Search(near, 10).TotalHits);

            near = new SpanOrQuery(new SpanQuery[] { spanPrfxNoSuch, spanPrfxNoSuch });
            Assert.AreEqual(0, Searcher.Search(near, 10).TotalHits);
        }
	    public void TestWildcardQuery()
	    {
	        var query = new WildcardQuery("name","张*");
	        var result = client.Search(index, "type" , query, 0, 5);
	        Assert.AreEqual(3, result.GetTotalCount());
	        Assert.AreEqual(3, result.GetHits().Hits.Count);
	        foreach (var VARIABLE in result.GetHits().Hits)
	        {
	            Console.WriteLine(VARIABLE.Source["name"]);
	        }

	        Console.WriteLine("--");
	        query = new WildcardQuery("name", "张三*");
	        result = client.Search(index, "type" , query, 0, 5);
	        Assert.AreEqual(2, result.GetTotalCount());
	        Assert.AreEqual(2, result.GetHits().Hits.Count);
	        foreach (var VARIABLE in result.GetHits().Hits)
	        {
	            Console.WriteLine(VARIABLE.Source["name"]);
	        }
	    }
        public virtual void TestNoSuchMultiTermsInSpanFirst()
        {
            //this hasn't been a problem
            FuzzyQuery fuzzyNoSuch = new FuzzyQuery(new Term("field", "noSuch"), 1, 0, 1, false);
            SpanQuery spanNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(fuzzyNoSuch);
            SpanQuery spanFirst = new SpanFirstQuery(spanNoSuch, 10);

            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);

            WildcardQuery wcNoSuch = new WildcardQuery(new Term("field", "noSuch*"));
            SpanQuery spanWCNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(wcNoSuch);
            spanFirst = new SpanFirstQuery(spanWCNoSuch, 10);
            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);

            RegexpQuery rgxNoSuch = new RegexpQuery(new Term("field", "noSuch"));
            SpanQuery spanRgxNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(rgxNoSuch);
            spanFirst = new SpanFirstQuery(spanRgxNoSuch, 10);
            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);

            PrefixQuery prfxNoSuch = new PrefixQuery(new Term("field", "noSuch"));
            SpanQuery spanPrfxNoSuch = new SpanMultiTermQueryWrapper<MultiTermQuery>(prfxNoSuch);
            spanFirst = new SpanFirstQuery(spanPrfxNoSuch, 10);
            Assert.AreEqual(0, Searcher.Search(spanFirst, 10).TotalHits);
        }
 /// <summary>
 /// Adds a wildcard clause to this instance
 /// </summary>
 /// <remarks>Wildcard clauses include '*' and '?' character</remarks>
 /// <param name="term">Term to add to this query</param>
 /// <param name="occurrence">Defines how the term is added to this query</param>
 public void AddWildcardClause(SearchTerm term, ClauseOccurrence occurrence)
 {
     if (term == null)
         throw new ArgumentNullException("term", "term cannot be null");
     IncrementTotalClauses(1);
     WildcardQuery wildcardQuery = new WildcardQuery(term.GetLuceneTerm());
     wildcardQuery.SetBoost(term.Boost);
     this.luceneQuery.Add(wildcardQuery, TypeConverter.ConvertToLuceneClauseOccurrence(occurrence));
     wildcardQuery = null;
 }