/// <summary> /// Adiciona o elemento para o elemento. /// </summary> /// <param name="writer"></param> /// <param name="analyzer"></param> /// <param name="element"></param> private void AddElement(IndexWriter writer, global::Lucene.Net.Analysis.Analyzer analyzer, Element element) { var document = new Document(); var channel = _structRepository.GetChannel(element.ChannelId); if (channel == null) { throw new InvalidOperationException(string.Format("Not found channel by channel id '{0}'", element.ChannelId)); } var random = new Random(); document.Add(new Field("Uid", element.Uid.ToString(), Field.Store.YES, Field.Index.ANALYZED)); document.Add(new Field("test", "1", Field.Store.NO, Field.Index.ANALYZED)); var fieldsCount = 0; foreach (var index in channel.Indexes) { if (index.Name.ToLower() == "hasimage") { var valueIndex = channel.GetIndexValue(element, "HasImage"); if (valueIndex.ToLower() == "true") { document.Add(new Field("Rnd", random.Next(10000).ToString(), Field.Store.YES, Field.Index.ANALYZED)); } } if (index.FieldSchema.Length == 1 && (index.FieldSchema[0].Type == typeof(DateTime) || index.FieldSchema[0].Type == typeof(DateTime?))) { var valueDateTime = channel.GetFieldObjectValue(element, index.FieldSchema[0]); string valueString = ""; if (valueDateTime != null) { if (valueDateTime is DateTime?) { valueString = ((DateTime?)valueDateTime).GetValueOrDefault().Ticks.ToString(); } else { valueString = ((DateTime)valueDateTime).Ticks.ToString(); } } document.Add(new Field(index.Name + "Ticks", valueString, Field.Store.NO, Field.Index.ANALYZED, Field.TermVector.YES)); } var value = channel.GetIndexValue(element, index.Name); fieldsCount++; var field = new Field(index.Name, RemoveAcent(value) ?? "", Field.Store.NO, Field.Index.ANALYZED, Field.TermVector.YES); document.Add(field); } var fullTextItems = new List <string>(); foreach (var field in channel.Fields) { if (field.IsSegmentValue) { lock (_segments) { var value = channel.GetFieldValue(element, field); if (!string.IsNullOrEmpty(value)) { value = RemoveAcent(value); using (var reader = new System.IO.StringReader(value)) { var tokenStream = analyzer.TokenStream(field.Name, reader); List <string> terms = new List <string>(); var token = tokenStream.Next(); while (token != null) { var term = token.TermText(); if (!terms.Contains(term)) { terms.Add(term); } token = tokenStream.Next(); } foreach (var i in terms) { List <int> segmentItems = null; if (_segments.TryGetValue(i, out segmentItems)) { var index = segmentItems.BinarySearch(element.Uid); if (index < 0) { segmentItems.Insert(~index, element.Uid); } } else { _segments.Add(i, new List <int> { element.Uid }); } } } } } } if (field.IncludeInFullText) { var fullTextValue = channel.GetFieldFullTextValue(element, field.Name); if (!string.IsNullOrEmpty(fullTextValue)) { fullTextValue = RemoveAcent(fullTextValue); var terms = new List <string>(); using (var stringReader = new System.IO.StringReader(fullTextValue)) { var tokenStream = analyzer.TokenStream("FullText", stringReader); var token = tokenStream.Next(); while (token != null) { var term = token.TermText(); terms.Add(term); token = tokenStream.Next(); } } foreach (var i in terms) { var index = fullTextItems.BinarySearch(i); if (index < 0) { fullTextItems.Insert(~index, i); } } } } } if (fieldsCount > 0 || fullTextItems.Count > 0) { if (fullTextItems.Count > 0) { fullTextItems.Sort(); document.Add(new Field("FullText", string.Join(" ", fullTextItems.ToArray()), Field.Store.YES, Field.Index.ANALYZED)); } writer.AddDocument(document, analyzer); } _dataRepository.Add(element); }
/// <summary> /// Recupera a consulta dos parametros informados. /// </summary> /// <param name="parameters"></param> /// <param name="analyzer"></param> /// <returns></returns> private static Query GetQuery(Parameter[] parameters, ISchemeRepository schemeRepository, global::Lucene.Net.Analysis.Analyzer analyzer) { if (parameters == null) { return(null); } var queries = new List <Query>(); foreach (var i in parameters.Distinct(new Parameter.NameEqualityComparer())) { var index = schemeRepository.GetSchemaIndex(i.Name); string parserValue = null; switch (i.SearchType) { case SearchType.Equal: parserValue = "\"" + GetParameterValue(i, index) + "\""; break; case SearchType.Like: parserValue = i.Value; break; case SearchType.Between: var betweenValues = GetParameterValues(i, index); parserValue = string.Format("[{0} TO {1}]", betweenValues[0], betweenValues[1]); break; case SearchType.In: parserValue = string.Join(" OR ", GetParameterValues(i, index)); break; case SearchType.Or: parserValue = string.Join(" OR ", GetParameterValues(i, index)); break; case SearchType.Greater: case SearchType.GreaterEqual: parserValue = string.Format("[{0} TO *]", GetParameterValue(i, index)); break; case SearchType.Less: case SearchType.LessEqual: parserValue = string.Format("[* TO {0}]", GetParameterValue(i, index)); break; default: throw new InvalidOperationException(string.Format("Invalid SearchParameterType ({0})", i.SearchType)); } var parser = new QueryParser(Version.LUCENE_29, i.Name, analyzer); queries.Add(parser.Parse(parserValue)); } if (queries.Count > 0) { var query = new global::Lucene.Net.Search.BooleanQuery(); foreach (var i in queries) { query.Add(new global::Lucene.Net.Search.BooleanClause(i, global::Lucene.Net.Search.BooleanClause.Occur.MUST)); } return(query); } return(null); }