/// <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); }
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(); }
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); }
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); }
/// <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); }
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); }
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)); }
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"))); }
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"))); }
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(); }
private Filter GetRangeFilter(string field, string lowerPrice, string upperPrice) { Filter f = TermRangeFilter.NewStringRange(field, lowerPrice, upperPrice, true, true); return(f); }
/// <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; }
/// <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; }
/// <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; }
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(); }
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(); }
/// <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); }