예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }