132 lines
5.0 KiB
C#
132 lines
5.0 KiB
C#
/*
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one
|
|
* or more contributor license agreements. See the NOTICE file
|
|
* distributed with this work for additional information
|
|
* regarding copyright ownership. The ASF licenses this file
|
|
* to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing,
|
|
* software distributed under the License is distributed on an
|
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
* KIND, either express or implied. See the License for the
|
|
* specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
*/
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using Lucene.Net;
|
|
using Lucene.Net.Analysis;
|
|
using Lucene.Net.Analysis.Standard;
|
|
using Lucene.Net.Documents;
|
|
using Lucene.Net.Index;
|
|
using Lucene.Net.Search;
|
|
using Lucene.Net.Search.Spans;
|
|
using Lucene.Net.Store;
|
|
using Version = Lucene.Net.Util.Version;
|
|
using NUnit.Framework;
|
|
|
|
namespace Contrib.Regex.Test
|
|
{
|
|
[TestFixture]
|
|
public class TestSpanRegexQuery : TestCase
|
|
{
|
|
Directory indexStoreA = new RAMDirectory();
|
|
|
|
Directory indexStoreB = new RAMDirectory();
|
|
|
|
[Test]
|
|
public void TestSpanRegex()
|
|
{
|
|
RAMDirectory directory = new RAMDirectory();
|
|
IndexWriter writer = new IndexWriter(directory, new SimpleAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);
|
|
Document doc = new Document();
|
|
// doc.Add(new Field("field", "the quick brown fox jumps over the lazy dog",
|
|
// Field.Store.NO, Field.Index.ANALYZED));
|
|
// writer.AddDocument(doc);
|
|
// doc = new Document();
|
|
doc.Add(new Field("field", "auto update", Field.Store.NO,
|
|
Field.Index.ANALYZED));
|
|
writer.AddDocument(doc);
|
|
doc = new Document();
|
|
doc.Add(new Field("field", "first auto update", Field.Store.NO,
|
|
Field.Index.ANALYZED));
|
|
writer.AddDocument(doc);
|
|
writer.Optimize();
|
|
writer.Close();
|
|
|
|
IndexSearcher searcher = new IndexSearcher(directory, true);
|
|
SpanRegexQuery srq = new SpanRegexQuery(new Term("field", "aut.*"));
|
|
SpanFirstQuery sfq = new SpanFirstQuery(srq, 1);
|
|
// SpanNearQuery query = new SpanNearQuery(new SpanQuery[] {srq, stq}, 6,
|
|
// true);
|
|
int numHits = searcher.Search(sfq, null, 1000).TotalHits;
|
|
Assert.AreEqual(1, numHits);
|
|
}
|
|
|
|
[Test]
|
|
public void TestSpanRegexBug()
|
|
{
|
|
CreateRamDirectories();
|
|
|
|
SpanRegexQuery srq = new SpanRegexQuery(new Term("field", "a.*"));
|
|
SpanRegexQuery stq = new SpanRegexQuery(new Term("field", "b.*"));
|
|
SpanNearQuery query = new SpanNearQuery(new SpanQuery[] { srq, stq }, 6,
|
|
true);
|
|
|
|
// 1. Search the same store which works
|
|
IndexSearcher[] arrSearcher = new IndexSearcher[2];
|
|
arrSearcher[0] = new IndexSearcher(indexStoreA, true);
|
|
arrSearcher[1] = new IndexSearcher(indexStoreB, true);
|
|
MultiSearcher searcher = new MultiSearcher(arrSearcher);
|
|
int numHits = searcher.Search(query, null, 1000).TotalHits;
|
|
arrSearcher[0].Close();
|
|
arrSearcher[1].Close();
|
|
|
|
// Will fail here
|
|
// We expect 2 but only one matched
|
|
// The rewriter function only write it once on the first IndexSearcher
|
|
// So it's using term: a1 b1 to search on the second IndexSearcher
|
|
// As a result, it won't match the document in the second IndexSearcher
|
|
Assert.AreEqual(2, numHits);
|
|
indexStoreA.Close();
|
|
indexStoreB.Close();
|
|
}
|
|
|
|
private void CreateRamDirectories()
|
|
{
|
|
// creating a document to store
|
|
Document lDoc = new Document();
|
|
lDoc.Add(new Field("field", "a1 b1", Field.Store.NO,
|
|
Field.Index.ANALYZED_NO_NORMS));
|
|
|
|
// creating a document to store
|
|
Document lDoc2 = new Document();
|
|
lDoc2.Add(new Field("field", "a2 b2", Field.Store.NO,
|
|
Field.Index.ANALYZED_NO_NORMS));
|
|
|
|
// creating first index writer
|
|
IndexWriter writerA = new IndexWriter(indexStoreA, new StandardAnalyzer(Version.LUCENE_CURRENT),
|
|
true, IndexWriter.MaxFieldLength.LIMITED);
|
|
writerA.AddDocument(lDoc);
|
|
writerA.Optimize();
|
|
writerA.Close();
|
|
|
|
// creating second index writer
|
|
IndexWriter writerB = new IndexWriter(indexStoreB, new StandardAnalyzer(Version.LUCENE_CURRENT),
|
|
true, IndexWriter.MaxFieldLength.LIMITED);
|
|
writerB.AddDocument(lDoc2);
|
|
writerB.Optimize();
|
|
writerB.Close();
|
|
}
|
|
}
|
|
}
|