/// <summary>
        ///     Creates the query.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static Filter CreateQuery(ISearchCriteria criteria, string field, RangeFilterValue value)
        {
            var query = new BooleanFilter();

            object lowerbound = value.Lower;
            object upperbound = value.Upper;

            const bool lowerboundincluded = true;
            const bool upperboundincluded = false;

            var currency = criteria.Currency.ToLower();

            var upper = upperbound == null?NumericUtils.LongToPrefixCoded(long.MaxValue) : ConvertToSearchable(upperbound);

            // format is "fieldname_store_currency_pricelist"
            string[] pls            = null;
            var      searchCriteria = criteria as CatalogIndexedSearchCriteria;

            if (searchCriteria != null)
            {
                pls = searchCriteria.Pricelists;
            }

            var parentPriceList = String.Empty;

            // Create  filter of type
            // price_USD_pricelist1:[100 TO 200} (-price_USD_pricelist1:[* TO *} +(price_USD_pricelist2:[100 TO 200} (-price_USD_pricelist2:[* TO *} (+price_USD_pricelist3[100 TO 200}))))

            if (pls == null || !pls.Any())
            {
                return(null);
            }

            var priceListId = pls[0].ToLower();

            var filter = new TermRangeFilter(
                String.Format("{0}_{1}_{2}", field, currency, priceListId),
                ConvertToSearchable(lowerbound),
                upper,
                lowerboundincluded,
                upperboundincluded);

            query.Add(new FilterClause(filter, Occur.SHOULD));

            if (pls.Count() > 1)
            {
                var q = CreatePriceRangeQuery(
                    pls,
                    1,
                    field,
                    currency,
                    ConvertToSearchable(lowerbound),
                    upper,
                    lowerboundincluded,
                    upperboundincluded);
                query.Add(new FilterClause(q, Occur.SHOULD));
            }

            return(query);
        }
Esempio n. 2
0
        static void Main(string[] args)
        {
            Lucene.Net.Util.Version version = Lucene.Net.Util.Version.LUCENE_29;

            Directory dir      = new RAMDirectory();
            Analyzer  analyzer = new StandardAnalyzer(version);

            var docs = CreateDocuments();

            AddToIndex(docs, dir, analyzer);

            // Search for the content
            var   parser = new MultiFieldQueryParser(version, new[] { "name" }, analyzer);
            Query q      = parser.Parse("An*");

            Filter filter = TermRangeFilter.More("date", DateTools.DateToString(new DateTime(2011, 1, 1), DateTools.Resolution.DAY));

            var searcher = new IndexSearcher(dir, true);

            TopDocs hits = searcher.Search(q, filter, 5, Sort.RELEVANCE);

            Console.WriteLine("Found {0} document(s) that matched query '{1}':", hits.TotalHits, q);
            foreach (ScoreDoc match in hits.ScoreDocs)
            {
                Document doc = searcher.Doc(match.Doc);
                Console.WriteLine("Matched id = {0}, Name = {1}", doc.Get("id"), doc.Get("name"));
            }
            searcher.Close();
        }
Esempio n. 3
0
        public static Filter CreateRangeFilterForValue(string fieldName, string lower, string upper, bool includeLower, bool includeUpper)
        {
            Filter result = null;

            // If both bounds are empty, ignore this range
            if (!string.IsNullOrEmpty(lower) || !string.IsNullOrEmpty(upper))
            {
                var lowerLong = ConvertToDateTimeTicks(lower);
                var upperLong = ConvertToDateTimeTicks(upper);
                if (lowerLong != null || upperLong != null)
                {
                    result = NumericRangeFilter.NewInt64Range(fieldName, lowerLong, upperLong, includeLower, includeUpper);
                }
                else
                {
                    var lowerDouble = ConvertToDouble(lower);
                    var upperDouble = ConvertToDouble(upper);
                    if (lowerDouble != null || upperDouble != null)
                    {
                        result = NumericRangeFilter.NewDoubleRange(fieldName, lowerDouble, upperDouble, includeLower, includeUpper);
                    }
                    else
                    {
                        result = TermRangeFilter.NewStringRange(fieldName, lower, upper, includeLower, includeUpper);
                    }
                }
            }

            return(result);
        }
Esempio n. 4
0
        public List <LuceneResult <T> > Search(String[] fields, String querystring,
                                               String datecol, String lowerdate, String uppderdate)
        {
            log.Debug("start new search for multiple fields and range");
            //RangeFilter filter = new RangeFilter(datecol, lowerDate, upperDate, true, true);
            Searcher searcher = new IndexSearcher(reader);
            Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

            String low = lowerdate;
            String up  = uppderdate;

            DateTime dt1 = DateTime.MinValue;

            if (DateTime.TryParse(lowerdate, out dt1))
            {
                low = Sharpend.Utils.Utils.getDateTimeForIndex(dt1);
            }

            DateTime dt2 = DateTime.MinValue;

            if (DateTime.TryParse(uppderdate, out dt2))
            {
                up = Sharpend.Utils.Utils.getDateTimeForIndex(dt2);
            }

            Query query;

            if (String.IsNullOrEmpty(querystring))
            {
                query = new TermRangeQuery(datecol, low, up, true, true);
            }
            else
            {
                MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, fields, analyzer);
                parser.DefaultOperator = QueryParser.Operator.AND;
                query = parser.Parse(querystring);
            }

            AnonymousClassCollector streamingHitCollector = new AnonymousClassCollector(searcher);

            if (String.IsNullOrEmpty(querystring))
            {
                searcher.Search(query, streamingHitCollector);
            }
            else
            {
                TermRangeFilter filter = new TermRangeFilter(datecol, low, up, true, true);
                searcher.Search(query, filter, streamingHitCollector);
            }

            query = null;

            List <LuceneResult <T> > ret = streamingHitCollector.GetSortedResult();

            log.Debug("resultcount: " + ret.Count);
            return(ret);
        }
Esempio n. 5
0
        /// <summary>
        ///     Creates the query.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static Filter CreateTermRangeFilter(string field, RangeFilterValue value)
        {
            object lowerbound = value.Lower;
            object upperbound = value.Upper;

            var query = new TermRangeFilter(field, ConvertToSearchable(lowerbound), ConvertToSearchable(upperbound), true, false);

            return(query);
        }
Esempio n. 6
0
        private static IEnumerable <ProductModel> _search(string searchQuery, int UserId, string searchField = "")
        {
            // validation
            if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            {
                return(new List <ProductModel>());
            }

            // set up lucene searcher
            using (var searcher = new IndexSearcher(_directory, false))
            {
                var hits_limit = 20;
                var analyzer   = new StandardAnalyzer(Version.LUCENE_30);
                Lucene.Net.Search.TermRangeFilter filter = new TermRangeFilter("OwnerIdString", UserId.ToString(), UserId.ToString(), true, true);


                // search by single field
                if (!string.IsNullOrEmpty(searchField))
                {
                    var parser = new QueryParser(Version.LUCENE_30, searchField, analyzer);
                    var query  = parseQuery(searchQuery, parser);

                    ScoreDoc[] hits;
                    hits = searcher.Search(query, hits_limit).ScoreDocs;
                    //if (UserId != 0)
                    //    hits = searcher.Search(query, filter, hits_limit).ScoreDocs;
                    //else
                    //    hits = searcher.Search(query, hits_limit).ScoreDocs;

                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
                // search by multiple fields (ordered by RELEVANCE)
                else
                {
                    var parser = new MultiFieldQueryParser
                                     (Version.LUCENE_30, new[] { "SrcId", "Title", "Description", "Brand", "Gtin", "Mpn" }, analyzer);
                    var query = parseQuery(searchQuery, parser);

                    ScoreDoc[] hits;
                    hits = searcher.Search(query, hits_limit).ScoreDocs;

                    //if (UserId != 0)
                    //    hits = searcher.Search(query, filter, hits_limit, Sort.RELEVANCE).ScoreDocs;
                    //else
                    //    hits = searcher.Search(query, null, hits_limit, Sort.RELEVANCE).ScoreDocs;

                    var results = _mapLuceneToDataList(hits, searcher);
                    analyzer.Close();
                    searcher.Dispose();
                    return(results);
                }
            }
        }
        /// <summary>
        ///     Creates the price range query.
        /// </summary>
        /// <param name="priceLists">The price lists.</param>
        /// <param name="index">The index.</param>
        /// <param name="field">The field.</param>
        /// <param name="currency">The currency.</param>
        /// <param name="lowerbound">The lowerbound.</param>
        /// <param name="upperbound">The upperbound.</param>
        /// <param name="lowerboundincluded">
        ///     if set to <c>true</c> [lowerboundincluded].
        /// </param>
        /// <param name="upperboundincluded">
        ///     if set to <c>true</c> [upperboundincluded].
        /// </param>
        /// <returns></returns>
        private static BooleanFilter CreatePriceRangeQuery(
            string[] priceLists,
            int index,
            string field,
            string currency,
            string lowerbound,
            string upperbound,
            bool lowerboundincluded,
            bool upperboundincluded)
        {
            var query = new BooleanFilter();

            // create left part
            var filter =
                new TermRangeFilter(
                    String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()),
                    "*",
                    "*",
                    true,
                    false);
            var leftClause = new FilterClause(filter, Occur.MUST_NOT);

            query.Add(leftClause);

            // create right part
            if (index == priceLists.Count()) // last element
            {
                //var rangefilter = NumericRangeFilter.;
                var filter2 =
                    new TermRangeFilter(
                        String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()),
                        lowerbound,
                        upperbound,
                        lowerboundincluded,
                        upperboundincluded);
                var rightClause = new FilterClause(filter2, Occur.MUST);
                query.Add(rightClause);
            }
            else
            {
                query.Add(new FilterClause(
                              CreatePriceRangeQuery(
                                  priceLists,
                                  index + 1,
                                  field,
                                  currency,
                                  lowerbound,
                                  upperbound,
                                  lowerboundincluded,
                                  upperboundincluded),
                              Occur.SHOULD));
            }

            return(query);
        }
Esempio n. 8
0
        public virtual Filter GetFilter(XmlElement e)
        {
            string fieldName = DOMUtils.GetAttributeWithInheritance(e, "fieldName");

            string lowerTerm    = e.GetAttribute("lowerTerm");
            string upperTerm    = e.GetAttribute("upperTerm");
            bool   includeLower = DOMUtils.GetAttribute(e, "includeLower", true);
            bool   includeUpper = DOMUtils.GetAttribute(e, "includeUpper", true);

            return(TermRangeFilter.NewStringRange(fieldName, lowerTerm, upperTerm, includeLower, includeUpper));
        }
Esempio n. 9
0
        public override void SetUp()
        {
            base.SetUp();
            directory = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(
#if FEATURE_INSTANCE_TESTDATA_INITIALIZATION
                this,
#endif
                Random, directory);
            // we use the default Locale/TZ since LuceneTestCase randomizes it
            var cal = new GregorianCalendar().ToDateTime(2003, 1, 1, 0, 0, 0, 0); // 2003 January 01

            cal = TimeZoneInfo.ConvertTime(cal, TimeZoneInfo.Local);

            for (int i = 0; i < Max; i++)
            {
                Document doc = new Document();
                doc.Add(NewStringField("key", "" + (i + 1), Field.Store.YES));
                doc.Add(NewStringField("owner", (i < Max / 2) ? "bob" : "sue", Field.Store.YES));
                doc.Add(NewStringField("date", cal.ToString(CultureInfo.InvariantCulture), Field.Store.YES));
                writer.AddDocument(doc);

                cal = cal.AddDays(1);
            }
            reader = writer.GetReader();
            writer.Dispose();

            searcher = NewSearcher(reader);

            // query for everything to make life easier
            BooleanQuery bq = new BooleanQuery();

            bq.Add(new TermQuery(new Term("owner", "bob")), Occur.SHOULD);
            bq.Add(new TermQuery(new Term("owner", "sue")), Occur.SHOULD);
            query = bq;

            // date filter matches everything too
            //Date pastTheEnd = parseDate("2099 Jan 1");
            // dateFilter = DateFilter.Before("date", pastTheEnd);
            // just treat dates as strings and select the whole range for now...
            dateFilter = TermRangeFilter.NewStringRange("date", "", "ZZZZ", true, true);

            bobFilter = new QueryWrapperFilter(
                new TermQuery(new Term("owner", "bob")));
            sueFilter = new QueryWrapperFilter(
                new TermQuery(new Term("owner", "sue")));
        }
        public void SetUp()
        {
            directory = new RAMDirectory();
            IndexWriter writer =
                new IndexWriter(directory, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);

            DateTime cal = new DateTime(1041397200000L * TimeSpan.TicksPerMillisecond); // 2003 January 01

            for (int i = 0; i < MAX; i++)
            {
                Document doc = new Document();
                doc.Add(new Field("key", "" + (i + 1), Field.Store.YES, Field.Index.NOT_ANALYZED));
                doc.Add(new Field("owner", (i < MAX / 2) ? "bob" : "sue", Field.Store.YES, Field.Index.NOT_ANALYZED));
                doc.Add(new Field("date", (cal.Ticks / TimeSpan.TicksPerMillisecond).ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                writer.AddDocument(doc);

                cal.AddMilliseconds(1);
            }

            writer.Close();

            searcher = new IndexSearcher(directory, true);

            // query for everything to make life easier
            BooleanQuery bq = new BooleanQuery();

            bq.Add(new TermQuery(new Term("owner", "bob")), BooleanClause.Occur.SHOULD);
            bq.Add(new TermQuery(new Term("owner", "sue")), BooleanClause.Occur.SHOULD);
            query = bq;

            // date filter matches everything too
            //Date pastTheEnd = parseDate("2099 Jan 1");
            // dateFilter = DateFilter.Before("date", pastTheEnd);
            // just treat dates as strings and select the whole range for now...
            dateFilter = new TermRangeFilter("date", "", "ZZZZ", true, true);

            bobFilter = new QueryWrapperFilter(
                new TermQuery(new Term("owner", "bob")));
            sueFilter = new QueryWrapperFilter(
                new TermQuery(new Term("owner", "sue")));
        }
Esempio n. 11
0
        public override void SetUp()
        {
            base.SetUp();
            directory = NewDirectory();
            RandomIndexWriter writer = new RandomIndexWriter(Random(), directory, Similarity, TimeZone);
            // we use the default Locale/TZ since LuceneTestCase randomizes it
            var cal = new DateTime(1970, 1, 1, 0, 0, 0, (int)TestUtil.NextLong(Random(), 0, long.MaxValue), new GregorianCalendar());

            for (int i = 0; i < Max; i++)
            {
                Document doc = new Document();
                doc.Add(NewStringField("key", "" + (i + 1), Field.Store.YES));
                doc.Add(NewStringField("owner", (i < Max / 2) ? "bob" : "sue", Field.Store.YES));
                doc.Add(NewStringField("date", cal.ToString(CultureInfo.InvariantCulture), Field.Store.YES));
                writer.AddDocument(doc);

                cal = cal.AddDays(1);
            }
            reader = writer.Reader;
            writer.Dispose();

            searcher = NewSearcher(reader);

            // query for everything to make life easier
            BooleanQuery bq = new BooleanQuery();

            bq.Add(new TermQuery(new Term("owner", "bob")), BooleanClause.Occur.SHOULD);
            bq.Add(new TermQuery(new Term("owner", "sue")), BooleanClause.Occur.SHOULD);
            query = bq;

            // date filter matches everything too
            //Date pastTheEnd = parseDate("2099 Jan 1");
            // dateFilter = DateFilter.Before("date", pastTheEnd);
            // just treat dates as strings and select the whole range for now...
            dateFilter = TermRangeFilter.NewStringRange("date", "", "ZZZZ", true, true);

            bobFilter = new QueryWrapperFilter(new TermQuery(new Term("owner", "bob")));
            sueFilter = new QueryWrapperFilter(new TermQuery(new Term("owner", "sue")));
        }
Esempio n. 12
0
        public void StraightFilters()
        {
            CreateData();
            IFullTextSession s = Search.CreateFullTextSession(OpenSession());

            s.Transaction.Begin();
            BooleanQuery query = new BooleanQuery();

            query.Add(new TermQuery(new Term("teacher", "andre")), Occur.SHOULD);
            query.Add(new TermQuery(new Term("teacher", "max")), Occur.SHOULD);
            query.Add(new TermQuery(new Term("teacher", "aaron")), Occur.SHOULD);

            IFullTextQuery ftQuery = s.CreateFullTextQuery(query, typeof(Driver));

            ftQuery.EnableFullTextFilter("bestDriver");
            Lucene.Net.Search.Filter dateFilter = new TermRangeFilter("delivery", "2001", "2005", true, true);
            ftQuery.SetFilter(dateFilter);
            Assert.AreEqual(1, ftQuery.ResultSize, "Should select only liz");

            s.Transaction.Commit();
            s.Close();
            DeleteData();
        }
Esempio n. 13
0
        private Filter GetRangeFilter(string field, string lowerPrice, string upperPrice)
        {
            Filter f = TermRangeFilter.NewStringRange(field, lowerPrice, upperPrice, true, true);

            return(f);
        }
Esempio n. 14
0
        /// <summary>
        ///     Creates the price range query.
        /// </summary>
        /// <param name="priceLists">The price lists.</param>
        /// <param name="index">The index.</param>
        /// <param name="field">The field.</param>
        /// <param name="currency">The currency.</param>
        /// <param name="lowerbound">The lowerbound.</param>
        /// <param name="upperbound">The upperbound.</param>
        /// <param name="lowerboundincluded">
        ///     if set to <c>true</c> [lowerboundincluded].
        /// </param>
        /// <param name="upperboundincluded">
        ///     if set to <c>true</c> [upperboundincluded].
        /// </param>
        /// <returns></returns>
        private static BooleanFilter CreatePriceRangeQuery(
            string[] priceLists,
            int index,
            string field,
            string currency,
            string lowerbound,
            string upperbound,
            bool lowerboundincluded,
            bool upperboundincluded)
        {
            var query = new BooleanFilter();

            // create left part
            var filter =
                new TermRangeFilter(
                    String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()),
                    "*",
                    "*",
                    true,
                    false);
            var leftClause = new FilterClause(filter, Occur.MUST_NOT);
            query.Add(leftClause);

            // create right part
            if (index == priceLists.Count()) // last element
            {
                //var rangefilter = NumericRangeFilter.;
                var filter2 =
                    new TermRangeFilter(
                        String.Format("{0}_{1}_{2}", field, currency, priceLists[index - 1].ToLower()),
                        lowerbound,
                        upperbound,
                        lowerboundincluded,
                        upperboundincluded);
                var rightClause = new FilterClause(filter2, Occur.MUST);
                query.Add(rightClause);
            }
            else
            {
                query.Add(new FilterClause(
                    CreatePriceRangeQuery(
                        priceLists,
                        index + 1,
                        field,
                        currency,
                        lowerbound,
                        upperbound,
                        lowerboundincluded,
                        upperboundincluded),
                    Occur.SHOULD));
            }

            return query;
        }
Esempio n. 15
0
        /// <summary>
        ///     Creates the query.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static Filter CreateQuery(ISearchCriteria criteria, string field, RangeFilterValue value)
        {
            var query = new BooleanFilter();

            object lowerbound = value.Lower;
            object upperbound = value.Upper;

            const bool lowerboundincluded = true;
            const bool upperboundincluded = false;

            var currency = criteria.Currency.ToLower();

            var upper = upperbound == null ? NumericUtils.LongToPrefixCoded(long.MaxValue) : ConvertToSearchable(upperbound);

            // format is "fieldname_store_currency_pricelist"
            string[] pls = null;
            var searchCriteria = criteria as CatalogItemSearchCriteria;
            if (searchCriteria != null)
            {
                pls = searchCriteria.Pricelists;
            }

            var parentPriceList = String.Empty;

            // Create  filter of type 
            // price_USD_pricelist1:[100 TO 200} (-price_USD_pricelist1:[* TO *} +(price_USD_pricelist2:[100 TO 200} (-price_USD_pricelist2:[* TO *} (+price_USD_pricelist3[100 TO 200}))))

            if (pls == null || !pls.Any())
            {
                return null;
            }

            var priceListId = pls[0].ToLower();

            var filter = new TermRangeFilter(
                String.Format("{0}_{1}_{2}", field, currency, priceListId),
                ConvertToSearchable(lowerbound),
                upper,
                lowerboundincluded,
                upperboundincluded);

            query.Add(new FilterClause(filter, Occur.SHOULD));

            if (pls.Count() > 1)
            {
                var q = CreatePriceRangeQuery(
                    pls,
                    1,
                    field,
                    currency,
                    ConvertToSearchable(lowerbound),
                    upper,
                    lowerboundincluded,
                    upperboundincluded);
                query.Add(new FilterClause(q, Occur.SHOULD));
            }

            return query;
        }
Esempio n. 16
0
        /// <summary>
        ///     Creates the query.
        /// </summary>
        /// <param name="field">The field.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        public static Filter CreateQuery(string field, RangeFilterValue value)
        {
            object lowerbound = value.Lower;
            object upperbound = value.Upper;

            var query = new TermRangeFilter(
                field, ConvertToSearchable(lowerbound), ConvertToSearchable(upperbound), true, false);
            return query;
        }
Esempio n. 17
0
        public void TestGetBestFragmentsFilteredQuery()
        {
            var helper = new TestHighlightRunner();
            helper.TestAction = () =>
                                    {
                                        numHighlights = 0;
                                        TermRangeFilter rf = new TermRangeFilter("contents", "john", "john", true, true);
                                        SpanQuery[] clauses = {
                                                                  new SpanTermQuery(new Term("contents", "john")),
                                                                  new SpanTermQuery(new Term("contents", "kennedy"))
                                                              };
                                        SpanNearQuery snq = new SpanNearQuery(clauses, 1, true);
                                        FilteredQuery fq = new FilteredQuery(snq, rf);

                                        DoSearching(fq);
                                        helper.DoStandardHighlights(analyzer, searcher, hits, query, this);
                                        // Currently highlights "John" and "Kennedy" separately
                                        Assert.IsTrue(numHighlights == 2,
                                                      "Failed to find correct number of highlights " + numHighlights +
                                                      " found");
                                    };

            helper.Start();
        }
Esempio n. 18
0
        public void TestGetBestFragmentsFilteredPhraseQuery()
        {
            var helper = new TestHighlightRunner();
            helper.TestAction = () =>
                                    {
                                        numHighlights = 0;
                                        var rf = new TermRangeFilter("contents", "john", "john", true, true);
                                        var pq = new PhraseQuery();
                                        pq.Add(new Term("contents", "john"));
                                        pq.Add(new Term("contents", "kennedy"));
                                        var fq = new FilteredQuery(pq, rf);

                                        DoSearching(fq);
                                        helper.DoStandardHighlights(analyzer, searcher, hits, query, this);
                                        // Currently highlights "John" and "Kennedy" separately
                                        Assert.IsTrue(numHighlights == 2,
                                                      "Failed to find correct number of highlights " + numHighlights +
                                                      " found");
                                    };

            helper.Start();
        }
Esempio n. 19
0
        /// <summary>
        /// 查询数据
        /// </summary>
        /// <param name="startRowIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="totalCount"></param>
        /// <returns></returns>
        public List <KnowledgeInfoEntity> ShowDatas(SearchParam SearchParam, string[] JS_Fields)
        {
            List <KnowledgeInfoEntity> listData = new List <KnowledgeInfoEntity>();

            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(__SearchAppIndexPath), new NoLockFactory());

            IndexReader reader = IndexReader.Open(directory, true);
            //IndexSearcher是进行搜索的类
            IndexSearcher searcher = new IndexSearcher(reader);
            BooleanQuery  bQuery   = new BooleanQuery();


            //被""包裹,不进行分词处理
            if (SearchParam.KeyValue.Length > 2 &&
                SearchParam.KeyValue.IndexOf("\"") == 0 &&
                SearchParam.KeyValue.LastIndexOf("\"") == SearchParam.KeyValue.Length - 1)
            {
                SearchParam.KeyValue = SearchParam.KeyValue.Substring(1, SearchParam.KeyValue.Length - 2);
            }
            else
            {
                SearchParam.KeyValue = ReplaceChar(SearchParam.KeyValue);
                ////分词
                SearchParam.KeyValue = GetKeyWordsSplitBySpace(SearchParam.KeyValue);
            }
            if (string.IsNullOrEmpty(SearchParam.KeyValue))
            {
                return(listData);
            }

            QueryParser parse;
            Query       query;

            foreach (string strField in JS_Fields)
            {
                //创建标题索引搜索
                parse = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, strField, new PanGuAnalyzer());
                query = parse.Parse(SearchParam.KeyValue);
                parse.SetDefaultOperator(QueryParser.Operator.AND);
                bQuery.Add(query, BooleanClause.Occur.SHOULD);
            }

            TopScoreDocCollector collector = TopScoreDocCollector.create(__SearchAppResultMaxLength, true);
            //Sort sort = new Sort(new SortField("Addtime", SortField.DOC, true));
            Filter filter = null;

            if (!string.IsNullOrEmpty(SearchParam.DataType))
            {
                filter = new TermRangeFilter("DataType", SearchParam.DataType, SearchParam.DataType, true, true);
            }
            searcher.Search(bQuery, filter, collector);


            SearchParam.TotalCount = collector.GetTotalHits();//返回总条数
            //分页,下标从0开始,0是第一条记录
            ScoreDoc[] docs = collector.TopDocs((SearchParam.PageIndex - 1) * SearchParam.PageSize, SearchParam.PageSize).scoreDocs;


            for (int i = 0; i < docs.Length; i++)
            {
                //取文档的编号,这个是主键,lucene.net分配
                int docID = docs[i].doc;
                //检索结果中只有文档的id,如果要取Document,则需要Doc再去取
                //降低内容占用
                Document doc = searcher.Doc(docID);

                string content = doc.Get("ContentNoHtml");
                if (content.Length > 200)
                {
                    content = content.Substring(0, 199) + "……";
                }

                KnowledgeInfoEntity itemData = new KnowledgeInfoEntity()
                {
                    knowledgeGUID = new Guid(doc.Get("knowledgeGUID")).ToString(),
                    Title         = doc.Get("Title"),
                    Summary       = doc.Get("Summary"),
                    ContentNoHtml = content,
                    ContentHtml   = doc.Get("ContentHtml"),
                    CreateBy      = doc.Get("CreateBy"),
                    UpdateDate    = DateTime.Parse(doc.Get("UpdateDate")),
                    ViewCount     = int.Parse(doc.Get("ViewCount")),
                    DataType      = doc.Get("DataType"),
                };
                //高亮
                itemData.Title         = Preview(itemData.Title, SearchParam.KeyValue);
                itemData.ContentNoHtml = Preview(itemData.ContentNoHtml, SearchParam.KeyValue);
                itemData.Summary       = Preview(itemData.Summary, SearchParam.KeyValue);
                listData.Add(itemData);
            }
            return(listData);
        }