Exemplo n.º 1
0
        public Searcher(FullTextIndex index)
        {
            _index = index;
            _tx = _index.StorageEnvironment.NewTransaction(TransactionFlags.Read);

            _docs = _tx.ReadTree("Docs");
        }
Exemplo n.º 2
0
 public void Initialize(FullTextIndex index, Transaction tx, IndexingConventions.ScorerCalc score)
 {
     Index = index;
     Transaction = tx;
     Score = score;
     Init();
 }
Exemplo n.º 3
0
 public Indexer(FullTextIndex parent)
 {
     _parent = parent;
     _analyzer = _parent.Analyzer;
     _bufferPool = _parent.BufferPool;
     AutoFlush = true;
 }
Exemplo n.º 4
0
        public void CanCreateAndDisposeIndexer()
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (fti.CreateIndexer())
                {

                }
            }
        }
Exemplo n.º 5
0
        public void CanDelete()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren Eini");

                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Ayende Rahien");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "rahien")).Count());
                }

                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.DeleteIndexEntry(1);

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "rahien")).Count());
                }

                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.DeleteIndexEntry(2);

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "rahien")).Count());
                }

            }
        }
Exemplo n.º 6
0
 public FullTextIndexTests()
 {
     this.index = new FullTextIndexBuilder <string>()
                  .WithItemTokenization <TestObject>(
         o => o.WithKey(i => i.Id)
         .WithField("Text1", i => i.Text1, opts => opts.CaseInsensitive(false))
         .WithField("Text2", i => i.Text2)
         .WithField("Text3", i => i.Text3, opts => opts.WithStemming()))
                  .WithItemTokenization <TestObject2>(
         o => o.WithKey(i => i.Id)
         .WithField("MultiText", i => i.Text))
                  .WithItemTokenization <TestObject3>(
         o => o.WithKey(i => i.Id)
         .WithField("TextAsync", i => Task.Run(() => i.Text))
         .WithField("MultiTextAsync", i => Task.Run(() => (IEnumerable <string>)i.MultiText)))
                  .Build();
 }
Exemplo n.º 7
0
        public void CanDeleteAndCompact()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                fullTextIndex.Conventions.AutoCompact = false;
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.Index("Name", "Oren Eini");

                    indexer.NewIndexEntry();

                    indexer.Index("Name", "Ayende Rahien");

                    indexer.Flush();
                }

                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.DeleteIndexEntry(1);

                    indexer.Flush();
                }


                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "rahien")).Count());
                }
                Assert.Equal(2, fullTextIndex.NumberOfDocuments);
                Assert.Equal(1, fullTextIndex.NumberOfDeletes);
                fullTextIndex.RunCompaction();

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "rahien")).Count());
                }
                Assert.Equal(1, fullTextIndex.NumberOfDocuments);
                Assert.Equal(0, fullTextIndex.NumberOfDeletes);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        ///     Initialize an empty datastore from a type description
        /// </summary>
        /// <param name="collectionSchema"></param>
        /// <param name="evictionPolicy"></param>
        /// <param name="fullTextConfig"></param>
        public DataStore(CollectionSchema collectionSchema, EvictionPolicy evictionPolicy,
                         FullTextConfig fullTextConfig)
        {
            _fullTextConfig = fullTextConfig;

            CollectionSchema = collectionSchema ?? throw new ArgumentNullException(nameof(collectionSchema));

            EvictionPolicy = evictionPolicy ?? throw new ArgumentNullException(nameof(evictionPolicy));

            //initialize the primary key dictionary
            DataByPrimaryKey = new Dictionary <KeyValue, PackedObject>();


            //initialize the unique keys dictionaries (one by unique key)
            _dataByUniqueKey = new Dictionary <string, Dictionary <KeyValue, PackedObject> >();

            foreach (var keyInfo in collectionSchema.UniqueKeyFields)
            {
                _dataByUniqueKey.Add(keyInfo.Name, new Dictionary <KeyValue, PackedObject>());
            }

            //initialize the indexes (one by index key)
            _dataByIndexKey = new Dictionary <string, IndexBase>();

            // scalar indexed fields
            foreach (var indexField in collectionSchema.IndexFields)
            {
                var index = IndexFactory.CreateIndex(indexField);
                _dataByIndexKey.Add(indexField.Name, index);
            }


            // create the full-text index if required
            if (collectionSchema.FullText.Count > 0)
            {
                _fullTextIndex = new FullTextIndex(fullTextConfig)
                {
                    // a function that allows the full text engine to find the original line of text
                    LineProvider = pointer => DataByPrimaryKey[pointer.PrimaryKey].TokenizedFullText[pointer.Line]
                }
            }
            ;
        }
Exemplo n.º 9
0
        public void WillFilterStopWords()
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fti.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren and Ayende");

                    indexer.Flush();
                }

                using (var searcher = fti.CreateSearcher())
                {
                    Assert.Empty(searcher.Query(new TermQuery("Name", "and")));
                }
            }
        }
Exemplo n.º 10
0
        public void CanQueryUsingMissingField()
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fti.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren Eini");

                    indexer.Flush();
                }

                using (var searcher = fti.CreateSearcher())
                {
                    Assert.Empty(searcher.Query(new TermQuery("Foo", "Arava")));
                }
            }
        }
Exemplo n.º 11
0
        protected virtual async Task ExtractFulltextIndexesAsync(ExtractionContext context, CancellationToken token)
        {
            var query = BuildExtractFullTextIndexesQuery(context);

            var            currentTableId = 0;
            ColumnResolver table          = null;
            FullTextIndex  index          = null;
            var            cmd            = Connection.CreateCommand(query);

            await using (cmd.ConfigureAwait(false)) {
                var reader = await cmd.ExecuteReaderAsync(token).ConfigureAwait(false);

                await using (reader.ConfigureAwait(false)) {
                    while (await reader.ReadAsync(token).ConfigureAwait(false))
                    {
                        ReadFullTextIndexColumnData(reader, context, ref currentTableId, ref table, ref index);
                    }
                }
            }
        }
Exemplo n.º 12
0
        public async Task ReadIntoAsync(FullTextIndex <TKey> index)
        {
            await this.FillBufferAsync().ConfigureAwait(false);

            var itemCount = this.reader.ReadInt32();

            for (var i = 0; i < itemCount; i++)
            {
                var id  = this.reader.ReadInt32();
                var key = this.keySerializer.Read(this.reader);

                index.IdPool.Add(id, key);
            }

            index.SetRootWithLock(this.DeserializeNode(index.IndexNodeFactory, 0));

            if (this.reader.ReadInt32() != -1)
            {
                throw new DeserializationException(ExceptionMessages.MissingIndexTerminator);
            }
        }
Exemplo n.º 13
0
        private static void Main(string[] args)
        {
            // Create a full text index with default settings
            var index = new FullTextIndex <string>();

            // Index
            index.Index("A", "This is some text associated with A: fizz");
            index.Index("B", "Some buzz text for B");
            index.Index("C", "Text associated with C is both fizz and buzz");

            // Search for text containing both Fizz *and* Buzz
            var results = index.Search("Fizz Buzz").ToList();

            // Output: Items with both Fizz and Buzz: 1
            Console.WriteLine($"Items with both Fizz and Buzz: {results.Count}");

            // Search for text containing both Fizz *or* Buzz
            results = index.Search("Fizz | Buzz").ToList();

            // Outputs: Items with Fizz or Buzz: 3
            Console.WriteLine($"Items with Fizz or Buzz: {results.Count}");
        }
Exemplo n.º 14
0
        public void CanQueryAndUpdate()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();                     // doc 1

                    Assert.Equal(1L, indexer.CurrentDocumentId);

                    indexer.AddField("Name", "Oren Eini");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "oren")).Count());
                }

                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.UpdateIndexEntry(1);                     // doc 1

                    Assert.Equal(1L, indexer.CurrentDocumentId);

                    indexer.AddField("Name", "Ayende Rahien");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "ayende")).Count());
                }
            }
        }
Exemplo n.º 15
0
        public void CanDoPhraseQuery()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();
                    indexer.AddField("PhraseText", "Not a match.", options: FieldOptions.TermPositions);

                    indexer.NewIndexEntry();
                    indexer.AddField("PhraseText", "RavenDB is a very cool database to work with.", options: FieldOptions.TermPositions);

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new PhraseQuery("PhraseText", "ravendb", "cool", "database")
                    {
                        Slop = 4
                    }, 5);

                    Assert.Equal(1, results.Results.Length);
                    Assert.Equal(2, results.Results[0].DocumentId);
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new PhraseQuery("PhraseText", "database", "cool", "ravendb")
                    {
                        Slop = 4
                    }, 5);

                    Assert.Equal(0, results.Results.Length);
                }
            }
        }
Exemplo n.º 16
0
        public async Task <IEnumerable <FullTextIndex> > SelectIndexesAsync()
        {
            IList <FullTextIndex> output = null;

            using (var context = _dbContext)
            {
                output = await context.ExecuteReaderAsync(
                    CommandType.Text,
                    BySql,
                    async reader =>
                {
                    if ((reader != null) && (reader.HasRows))
                    {
                        output = new List <FullTextIndex>();
                        while (await reader.ReadAsync())
                        {
                            var index = new FullTextIndex();
                            index.PopulateModel(reader);
                            output.Add(index);
                        }
                    }

                    return(output);
                });

                // Remove table prefix from table names
                if (output != null)
                {
                    foreach (var index in output)
                    {
                        index.TableName = index.TableName.Replace(context.Configuration.TablePrefix, "");
                    }
                }
            }

            return(output);
        }
        /// <inheritdoc/>
        protected override IPathNode VisitFullTextIndex(FullTextIndex index)
        {
            var tableInfo = currentTable;
            var name      = index.Name.IsNullOrEmpty()
        ? string.Format("FT_{0}", index.DataTable.Name)
        : index.Name;
            var ftIndex = new StorageFullTextIndexInfo(tableInfo, name)
            {
                FullTextCatalog    = index.FullTextCatalog,
                ChangeTrackingMode = ConvertChangeTrackingMode(index.ChangeTrackingMode)
            };

            foreach (var column in index.Columns)
            {
                var    columnInfo = tableInfo.Columns[column.Column.Name];
                string typeColumn = null;
                if (column.TypeColumn != null)
                {
                    typeColumn = tableInfo.Columns[column.TypeColumn.Name].Name;
                }
                new FullTextColumnRef(ftIndex, columnInfo, column.Languages.Single().Name, typeColumn);
            }
            return(ftIndex);
        }
Exemplo n.º 18
0
        internal protected string GetFulltextVector(SqlCompilerContext context, FullTextIndex index)
        {
            var sb = new StringBuilder();

            sb.Append("(");
            var languageGroups = index
                                 .Columns
                                 .SelectMany(column => column.Languages, (column, language) => new { column, language })
                                 .GroupBy(pair => pair.language, pair => pair.column)
                                 .ToList();

            for (int i = 0; i < languageGroups.Count; i++)
            {
                if (i != 0)
                {
                    sb.Append(" || ");
                }
                var group   = languageGroups[i];
                var columns = group.ToList();
                sb.Append("to_tsvector('");
                sb.Append(group.Key.Name);
                sb.Append("'::regconfig, ");
                for (int j = 0; j < columns.Count; j++)
                {
                    if (j != 0)
                    {
                        sb.Append(" || ' '::text");
                    }
                    IndexColumn column = columns[j];
                    sb.AppendFormat("({0})::text", QuoteIdentifier(column.Name));
                }
                sb.Append(")");
            }
            sb.Append(")");
            return(sb.ToString());
        }
Exemplo n.º 19
0
        internal protected string GetFulltextVector(SqlCompilerContext context, FullTextIndex index)
        {
            var sb             = new StringBuilder("(");
            var languageGroups = index
                                 .Columns
                                 .SelectMany(column => column.Languages, (column, language) => new { column, language })
                                 .GroupBy(pair => pair.language, pair => pair.column);

            var isFirstOuter = true;

            foreach (var languageGroup in languageGroups)
            {
                if (!isFirstOuter)
                {
                    _ = sb.Append(" || ");
                }
                isFirstOuter = false;

                var columns      = languageGroup.ToList();
                var isFirstInner = true;
                _ = sb.Append("to_tsvector('")
                    .Append(languageGroup.Key.Name)
                    .Append("'::regconfig, ");
                foreach (var language in languageGroup)
                {
                    if (!isFirstInner)
                    {
                        _ = sb.Append(" || ' '::text");
                    }
                    isFirstInner = false;
                    _            = sb.AppendFormat("({0})::text", QuoteIdentifier(language.Name));
                }
                _ = sb.Append(")");
            }
            return(sb.Append(")").ToString());
        }
Exemplo n.º 20
0
 public IndexNavigatorTests()
 {
     this.index = new FullTextIndex <string>();
     this.index.Index("A", "Triumphant elephant strode elegantly with indifference to shouting subjects, giving withering looks to individuals");
     this.sut = new IndexNavigator(this.index.Root);
 }
Exemplo n.º 21
0
        private void ReadFullTextIndexColumnData(DbDataReader reader, ExtractionContext context,
                                                 ref int currentTableId, ref ColumnResolver table, ref FullTextIndex index)
        {
            var nextTableId = reader.GetInt32(1);

            if (currentTableId != nextTableId)
            {
                GetDataTable(nextTableId, context, ref currentTableId, ref table);
                index = table.Table.CreateFullTextIndex(string.Empty);
                index.FullTextCatalog = reader.GetBoolean(4)
          ? null
          : reader.GetString(3);
                index.UnderlyingUniqueIndex = reader.GetString(8);
                index.ChangeTrackingMode    = GetChangeTrackingMode(reader.GetString(9), reader.IsDBNull(10));
            }

            var column = index.CreateIndexColumn(table.GetColumn(reader.GetInt32(5)));

            column.TypeColumn = (reader.IsDBNull(6)) ? null : table.GetColumn(reader.GetInt32(6));
            column.Languages.Add(new Language(reader.GetString(7)));
        }
Exemplo n.º 22
0
        public void WillFilterStopWords()
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fti.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren and Ayende");

                    indexer.Flush();
                }

                using (var searcher = fti.CreateSearcher())
                {
                    Assert.Empty(searcher.Query(new TermQuery("Name", "and")));
                }
            }
        }
Exemplo n.º 23
0
        public override void Visit(SqlFreeTextTable node)
        {
            if (node.TargetColumns.Count != 1 || node.TargetColumns[0] != node.TargetTable.Asterisk)
            {
                throw new NotSupportedException(Strings.ExFreeTextSearchOnCustomColumnsNotSupported);
            }

            FullTextIndex fullTextIndex       = node.TargetTable.DataTable.Indexes.OfType <FullTextIndex>().Single();
            string        alias               = context.TableNameProvider.GetName(node);
            string        vector              = ((Translator)translator).GetFulltextVector(context, fullTextIndex);
            string        tableName           = translator.QuoteIdentifier(node.TargetTable.Name);
            int           internalColumnIndex = 0;

            while (node.Columns["column" + internalColumnIndex] != null)
            {
                internalColumnIndex++;
            }
            string vectorName = translator.QuoteIdentifier("column" + internalColumnIndex);

            internalColumnIndex++;
            while (node.Columns["column" + internalColumnIndex] != null)
            {
                internalColumnIndex++;
            }
            string queryName = translator.QuoteIdentifier("column" + internalColumnIndex);

            context.Output.AppendText("(SELECT ");
            for (int columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++)
            {
                if (columnIndex != 0)
                {
                    context.Output.AppendText(translator.ColumnDelimiter);
                }
                context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name));
            }
            context.Output.AppendText(translator.ColumnDelimiter);
            context.Output.AppendText("ts_rank_cd(");
            context.Output.AppendText(vectorName);
            context.Output.AppendText(translator.ArgumentDelimiter);
            context.Output.AppendText(queryName);
            context.Output.AppendText(") AS");
            context.Output.AppendText(translator.QuoteIdentifier(node.Columns[node.Columns.Count - 1].Name));
            context.Output.AppendText(" FROM (SELECT ");
            for (int columnIndex = 0; columnIndex < node.Columns.Count - 1; columnIndex++)
            {
                if (columnIndex != 0)
                {
                    context.Output.AppendText(translator.ColumnDelimiter);
                }
                context.Output.AppendText(translator.QuoteIdentifier(node.Columns[columnIndex].Name));
            }
            context.Output.AppendText(translator.ColumnDelimiter);
            context.Output.AppendText(string.Format("{0} AS {1}", vector, vectorName));
            context.Output.AppendText(translator.ColumnDelimiter);

            var languages = fullTextIndex
                            .Columns
                            .SelectMany(column => column.Languages)
                            .Select(language => language.Name)
                            .Distinct()
                            .ToList();

            context.Output.AppendText("(");
            for (int i = 0; i < languages.Count; i++)
            {
                if (i != 0)
                {
                    context.Output.AppendText(" || ");
                }
                var language = languages[i];
                context.Output.AppendText("to_tsquery('");
                context.Output.AppendText(language);
                context.Output.AppendText("'::regconfig, ");
                context.Output.AppendText("replace(trim(regexp_replace(");
                node.FreeText.AcceptVisitor(this);
                context.Output.AppendText(@",'\\W+', ' ', 'g')),' ', '|')");
                context.Output.AppendText(")");
            }
            context.Output.AppendText(")");

            context.Output.AppendText(string.Format(" AS {0}", queryName));
            context.Output.AppendText(string.Format(" FROM {0}) AS {1} WHERE {2} @@ {3})", tableName, alias, vectorName, queryName));
        }
Exemplo n.º 24
0
 public FullTextIndexTests()
 {
     index = new FullTextIndex(1.Seconds());
 }
Exemplo n.º 25
0
        /// <summary>
        /// This method will create a full-text index on a table with an associated stoplist
        /// </summary>
        public static void CreateFullTextIndex()
        {
            Console.WriteLine("Running CreateFullTextIndex Sample...");

            try
            {
                Server server = new Server(".");
                server.ConnectionContext.Connect();

                Console.WriteLine("Connected to '{0}' server", server.Name);

                Database db = new Database(server, "iFTSSampleDB2");
                db.Create();

                Console.WriteLine("Database '{0}' created", db.Name);

                // Create a default full-text catalog for the database
                FullTextCatalog ftcat = new FullTextCatalog(db, "ftcatalog");
                ftcat.IsDefault = true;
                ftcat.Create();

                Console.WriteLine("FullTextCatalog '{0}' created", ftcat.Name);

                // Add 2 columns to the table
                Table tab = new Table(db, "tab");
                tab.Columns.Add(new Column(tab, "col_fti", DataType.NVarChar(1000)));
                Column col = new Column(tab, "col_unique", DataType.Int);
                col.Nullable = false;
                tab.Columns.Add(col);

                // Create a table with a unique index on it
                Index idxUnique = new Index(tab, "tab_unique_idx");
                idxUnique.IndexKeyType = IndexKeyType.DriUniqueKey;
                idxUnique.IndexedColumns.Add(new IndexedColumn(idxUnique, col.Name));
                tab.Indexes.Add(idxUnique);
                tab.Create();

                Console.WriteLine("Table '{0}' created", tab.Name);

                // Add a column to the full-text index and associate it with a unique index
                FullTextIndex fti = new FullTextIndex(tab);
                fti.IndexedColumns.Add(new FullTextIndexColumn(fti, "col_fti"));
                fti.UniqueIndexName = idxUnique.Name;

                string stopword = "goodbye";
                string language = "English";

                // Create an empty full-text stoplist
                FullTextStopList stoplist = new FullTextStopList(db, "sampleStoplist");
                stoplist.Create();

                Console.WriteLine("FullTextStoplist '{0}' created", stoplist.Name);

                // Add a stopword to the full-text stoplist
                stoplist.AddStopWord(stopword, language);
                Console.WriteLine("Stopword '{0}' added to Stoplist '{1}'", stopword, stoplist.Name);

                fti.StopListName = "sampleStoplist";

                // Create the full-text index and associate the full-text stoplist with it
                fti.Create();

                Console.WriteLine("FullTextIndex on Table '{0}' created", tab.Name);

                fti.Drop();
                Console.WriteLine("FullTextIndex on Table '{0}' dropped", tab.Name);

                ftcat.Drop();
                Console.WriteLine("FullTextCatalog '{0}' dropped", ftcat.Name);

                tab.Drop();
                Console.WriteLine("Table '{0}' created", tab.Name);

                db.Drop();
                Console.WriteLine("Database '{0}' dropped", db.Name);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.WriteLine();
            }
        }
Exemplo n.º 26
0
        public void Can_Use_FullTextIndex_Directly()
        {
            // First we create an instance of FullTextIndex
            var index = new FullTextIndex();

            // Then we add texts to the index
            index.Add(_apodArticles);

            // After adding we can Search for texts that match a Lucene query expression
            // See https://lucene.apache.org/core/2_9_4/queryparsersyntax.html for a reference on Lucene query syntax
            var result =  index.Search("magellanic nebula visible in southern skies").ToList();
            var expected = 10;
            var actual = result.Count > 0 ? result[0] : -1;

            Assert.AreEqual<int>(expected, actual);   // Article #10 should come up on top

            result = index.Search("swift-tuttle comet").ToList();
            expected = 0;
            actual = result.Count > 0 ? result[0] : -1;

            Assert.AreEqual<int>(expected, actual);    // Article #0 should come up on top

            result = index.Search("china observation station in antartica").ToList();
            expected = 14;
            actual = result.Count > 0 ? result[0] : -1;

            Assert.AreEqual<int>(expected, actual);    // Article #14 should come up on top
        }
Exemplo n.º 27
0
 public QueryTests()
 {
     this.index = new FullTextIndex <string>();
     this.index.Index("A", "Some test text");
 }
Exemplo n.º 28
0
        static void Main(string[] args)
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.ForPath("index"), new DefaultAnalyzer()))
            {
                var tasks = new List <Task>();
                var queue = new BlockingCollection <string>(10 * 1000);
                for (int i = 0; i < 1; i++)
                {
                    tasks.Add(Task.Run(() =>
                    {
                        int indexerCount = 0;
                        using (var indexer = fti.CreateIndexer())
                        {
                            indexer.AutoFlush = false;
                            while (queue.IsCompleted == false)
                            {
                                string line;
                                try
                                {
                                    line = queue.Take();
                                }
                                catch (InvalidOperationException)
                                {
                                    break;
                                }
                                if (line == null)
                                {
                                    break;
                                }

                                if (++indexerCount % (50 * 1000) == 0)
                                {
                                    indexer.Flush();
                                }

                                indexer.NewIndexEntry();
                                indexer.AddField("Title", line);
                            }
                            indexer.Flush();
                        }
                    }));
                }

                var sp    = Stopwatch.StartNew();
                int count = 0;
                using (var reader = new StreamReader(new GZipStream(File.OpenRead("titles.gz"), CompressionMode.Decompress)))
                {
                    while (true)
                    {
                        var line = reader.ReadLine();
                        if (line == null)
                        {
                            break;
                        }

                        queue.Add(line);

                        if (++count % 50000 == 0)
                        {
                            Console.WriteLine("{0,10:#,#}: {1}", count, line);
                        }
                    }
                    queue.CompleteAdding();
                    Console.WriteLine("Reading  {0:#,#} in {1}", count, sp.Elapsed);
                }

                while (Task.WaitAll(tasks.ToArray(), 1000) == false)
                {
                    Console.Write("\r{0,10:#,#;;0}				", queue.Count);
                }

                Console.WriteLine("\rTotal " + sp.Elapsed);
            }
        }
Exemplo n.º 29
0
 public async Task InitializeAsync()
 {
     this.index = await CreateIndexAsync();
 }
Exemplo n.º 30
0
        public void CanQueryWithInQuery()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {

                    indexer.NewIndexEntry();
                    indexer.AddField("Name", "David Boike");

                    indexer.NewIndexEntry();
                    indexer.AddField("Name", "Oren Eini");

                    indexer.NewIndexEntry();
                    indexer.AddField("Name", "Arava Eini");

                    indexer.NewIndexEntry();
                    indexer.AddField("Name", "Sean Epping");

                    indexer.NewIndexEntry();
                    indexer.AddField("Name", "Joe DeCock");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new InQuery("Name", "joe", "epping", "boike"), 5);

                    Assert.Equal(3, results.Results.Length);
                }
            }
        }
Exemplo n.º 31
0
        /// <summary>
        /// This method will create a full-text index on a table with an associated stoplist
        /// </summary>
        public static void CreateFullTextIndex()
        {
            Console.WriteLine("Running CreateFullTextIndex Sample..."); 

            try
            {
                Server server = new Server(".");
                server.ConnectionContext.Connect();

                Console.WriteLine("Connected to '{0}' server", server.Name);

                Database db = new Database(server, "iFTSSampleDB2");
                db.Create();

                Console.WriteLine("Database '{0}' created", db.Name);

                // Create a default full-text catalog for the database
                FullTextCatalog ftcat = new FullTextCatalog(db, "ftcatalog");
                ftcat.IsDefault = true;
                ftcat.Create();

                Console.WriteLine("FullTextCatalog '{0}' created", ftcat.Name);

                // Add 2 columns to the table
                Table tab = new Table(db, "tab");
                tab.Columns.Add(new Column(tab, "col_fti", DataType.NVarChar(1000)));
                Column col = new Column(tab, "col_unique", DataType.Int);
                col.Nullable = false;
                tab.Columns.Add(col);

                // Create a table with a unique index on it
                Index idxUnique = new Index(tab, "tab_unique_idx");
                idxUnique.IndexKeyType = IndexKeyType.DriUniqueKey;
                idxUnique.IndexedColumns.Add(new IndexedColumn(idxUnique, col.Name));
                tab.Indexes.Add(idxUnique);
                tab.Create();

                Console.WriteLine("Table '{0}' created", tab.Name);

                // Add a column to the full-text index and associate it with a unique index
                FullTextIndex fti = new FullTextIndex(tab);
                fti.IndexedColumns.Add(new FullTextIndexColumn(fti, "col_fti"));
                fti.UniqueIndexName = idxUnique.Name;

                string stopword = "goodbye";
                string language = "English";

                // Create an empty full-text stoplist
                FullTextStopList stoplist = new FullTextStopList(db, "sampleStoplist");
                stoplist.Create();

                Console.WriteLine("FullTextStoplist '{0}' created", stoplist.Name);

                // Add a stopword to the full-text stoplist
                stoplist.AddStopWord(stopword, language);
                Console.WriteLine("Stopword '{0}' added to Stoplist '{1}'", stopword, stoplist.Name);

                fti.StopListName = "sampleStoplist";

                // Create the full-text index and associate the full-text stoplist with it
                fti.Create();

                Console.WriteLine("FullTextIndex on Table '{0}' created", tab.Name);

                fti.Drop();
                Console.WriteLine("FullTextIndex on Table '{0}' dropped", tab.Name);
                 
                ftcat.Drop();
                Console.WriteLine("FullTextCatalog '{0}' dropped", ftcat.Name);

                tab.Drop();
                Console.WriteLine("Table '{0}' created", tab.Name);

                db.Drop();
                Console.WriteLine("Database '{0}' dropped", db.Name);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                Console.WriteLine();
            }
        }
Exemplo n.º 32
0
        public void CanIndexSingleValue()
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fti.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren Eini");

                    indexer.Flush();
                }
            }
        }
Exemplo n.º 33
0
        public void CanQueryAndSort()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren Eini");

                    indexer.AddField("Email", "*****@*****.**");

                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Arava Eini");

                    indexer.AddField("Email", "*****@*****.**");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new TermQuery("Name", "eini"), 5, sortBy: new Sorter("Email"));

                    Assert.Equal(2, results.Results[0].DocumentId);
                    Assert.Equal(1, results.Results[1].DocumentId);
                }
            }
        }
Exemplo n.º 34
0
        public void CanQueryUsingSingleTerm()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren Eini");

                    indexer.AddField("Email", "*****@*****.**");

                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Arava Eini");

                    indexer.AddField("Email", "*****@*****.**");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(1, searcher.Query(new TermQuery("Name", "oren")).Count());
                    Assert.Equal(0, searcher.Query(new TermQuery("Name", "rahien")).Count());
                }
            }
        }
Exemplo n.º 35
0
 public void CanQueryOnEmptyindex()
 {
     using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
     {
         using (var searcher = fti.CreateSearcher())
         {
             Assert.Empty(searcher.Query(new TermQuery("Foo", "Arava")));
         }
     }
 }
Exemplo n.º 36
0
        public void CanQueryUsingMissingTerm()
        {
            using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fti.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren Eini");

                    indexer.Flush();
                }

                using (var searcher = fti.CreateSearcher())
                {
                    Assert.Empty(searcher.Query(new TermQuery("Name", "Arava")));
                }
            }
        }
Exemplo n.º 37
0
        public void CanQueryAndSortByTwoFields()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {

                    indexer.NewIndexEntry();
                    indexer.AddField("QueryFor", "yes");
                    indexer.AddField("FirstName", "David");
                    indexer.AddField("LastName", "Boike");

                    indexer.NewIndexEntry();
                    indexer.AddField("QueryFor", "yes");
                    indexer.AddField("FirstName", "Natalie");
                    indexer.AddField("LastName", "Boike");

                    indexer.NewIndexEntry();
                    indexer.AddField("QueryFor", "NO");
                    indexer.AddField("FirstName", "NO");
                    indexer.AddField("LastName", "NO");

                    indexer.NewIndexEntry();
                    indexer.AddField("QueryFor", "yes");
                    indexer.AddField("FirstName", "Oren");
                    indexer.AddField("LastName", "Eini");

                    indexer.NewIndexEntry();
                    indexer.AddField("QueryFor", "yes");
                    indexer.AddField("FirstName", "Arava");
                    indexer.AddField("LastName", "Eini");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new TermQuery("QueryFor", "yes"), 5, sortBy: new Sorter(new SortByTerm("LastName"), new SortByTerm("FirstName")));

                    Assert.Equal(4, results.Results.Length);
                    Console.WriteLine("{0}, {1}, {2}, {3}", results.Results[0].DocumentId, results.Results[1].DocumentId,
                        results.Results[2].DocumentId, results.Results[3].DocumentId);
                    Assert.Equal(1, results.Results[0].DocumentId);
                    Assert.Equal(2, results.Results[1].DocumentId);
                    Assert.Equal(5, results.Results[2].DocumentId);
                    Assert.Equal(4, results.Results[3].DocumentId);
                }
            }
        }
Exemplo n.º 38
0
        public void CanDoPhraseQuery()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();
                    indexer.AddField("PhraseText", "Not a match.", options: FieldOptions.TermPositions);

                    indexer.NewIndexEntry();
                    indexer.AddField("PhraseText", "RavenDB is a very cool database to work with.", options: FieldOptions.TermPositions);

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new PhraseQuery("PhraseText", "ravendb", "cool", "database")
                    {
                        Slop = 4
                    }, 5);

                    Assert.Equal(1, results.Results.Length);
                    Assert.Equal(2, results.Results[0].DocumentId);
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    var results = searcher.QueryTop(new PhraseQuery("PhraseText", "database", "cool", "ravendb")
                    {
                        Slop = 4
                    }, 5);

                    Assert.Equal(0, results.Results.Length);
                }
            }
        }
Exemplo n.º 39
0
 public void CanIndexEmptyDocument()
 {
     using (var fti = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
     {
         using (var indexer = fti.CreateIndexer())
         {
             indexer.NewIndexEntry();
             indexer.Flush();
         }
     }
 }
Exemplo n.º 40
0
 internal protected Root(AssocDB db)
     : base(db.storage)
 {
     this.db = db;
     attributes = db.storage.CreateIndex(typeof(string), true);
     relations = db.storage.CreateIndex(typeof(long), false);
     fullTextIndex = db.CreateFullTextIndex();
 }
Exemplo n.º 41
0
        public void CanQueryUsingBooleanQuery()
        {
            using (var fullTextIndex = new FullTextIndex(StorageEnvironmentOptions.CreateMemoryOnly(), new DefaultAnalyzer()))
            {
                using (var indexer = fullTextIndex.CreateIndexer())
                {
                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren");

                    indexer.AddField("Email", "*****@*****.**");

                    indexer.NewIndexEntry();

                    indexer.AddField("Name", "Oren");

                    indexer.AddField("Email", "*****@*****.**");

                    indexer.Flush();
                }

                using (var searcher = fullTextIndex.CreateSearcher())
                {
                    Assert.Equal(1, searcher.Query(new BooleanQuery(QueryOperator.And,
                        new TermQuery("Name", "oren"),
                        new TermQuery("Email", "*****@*****.**"))).Count());

                    Assert.Equal(2, searcher.Query(new BooleanQuery(QueryOperator.Or,
                        new TermQuery("Name", "oren"),
                        new TermQuery("Email", "*****@*****.**"))).Count());
                }
            }
        }