用'/'字符搜索-[LUCENE.NET 4]

search whit '/' character-[LUCENE.NET 4]

如何在文本中使用字符'/'进行搜索?在 LUCENE 4 中(在版本 3 中有效)我描述了测试

测试1

Lucene 4 索引

分析器:StandAnalizer

实测值

"01/02/03"
"01/02/04"
"01/02/05"

Lucene 4 搜索

搜索"01/02/05" whit TermQuery = 0 次点击

搜索"01/02*" whit WildCardQuery = 0 次点击

搜索"01" whit TermQuery = 3 次点击

搜索"01**" whit WildCardQuery = 0 次点击

测试2

Lucene 3 索引

分析器:StandAnalizer

实测值

"01/02/03"
"01/02/04"
"01/02/05"

Lucene 3 搜索

搜索"01/02/05" whit TermQuery = 1 次点击

搜索 "01/02*" whit WildCardQuery = 3 次点击

搜索"01" whit TermQuery = 0 次点击

搜索"01**" whit WildCardQuery = 3 次点击

test3

Lucene 3 索引

分析器:StandAnalizer

实测值

"01/02/03"
"01/02/04"
"01/02/05"

Lucene 4 搜索

搜索"01/02/05" whit TermQuery = 1 次点击

搜索 "01/02*" whit WildCardQuery = 3 次点击

搜索"01" whit TermQuery = 0 次点击

搜索"01**" whit WildCardQuery = 3 次点击

注意:搜索全文并测试whit scape

测试4

Lucene 4 索引

分析器:StandAnalizer

实测值

"01\/02\/03"
"01\/02\/04"
"01\/02\/05"

Lucene 4 搜索

搜索"01/02/05" whit TermQuery = 0 次点击

搜索"01/02*" whit WildCardQuery = 0 次点击

搜索"01" whit TermQuery = 3 次点击

搜索"01**" whit WildCardQuery = 0 次点击

测试5

Lucene 4 索引

分析器:StandAnalizer

实测值

"01\/02\/03"
"01\/02\/04"
"01\/02\/05"

Lucene 4 搜索

搜索"01\/02\/05" whit TermQuery = 0 次点击

搜索"01\/02*" whit WildCardQuery = 0 次点击

搜索"01" whit TermQuery = 3 次点击

搜索"01**" whit WildCardQuery = 0 次点击

test6

Lucene 4 索引

分析器:StandAnalizer

实测值

"01/02/03"
"01/02/04"
"01/02/05"

Lucene 4 搜索

搜索"01\/02\/05" whit TermQuery = 0 次点击

搜索"01\/02*" whit WildCardQuery = 0 次点击

搜索"01" whit TermQuery = 3 次点击

搜索"01**" whit WildCardQuery = 0 次点击

TermQuerySimpleAnalyzer 效果很好。我正在使用 Lucene.Net.4.8.0-beta00005。这是一个例子:

[TestMethod]
public void SearchByDate()
{
    using (RAMDirectory directory = new RAMDirectory())
    {
        using (SimpleAnalyzer analyzer = new SimpleAnalyzer(LuceneVersion.LUCENE_48))
        {
            IndexWriterConfig config = new IndexWriterConfig(LuceneVersion.LUCENE_48, analyzer);

            Document[] documents = new Document[]
            {
                new Document { new StringField("Date", "01/02/03", Field.Store.YES), },
                new Document { new StringField("Date", "01/02/04", Field.Store.YES), },
                new Document { new StringField("Date", "01/02/05", Field.Store.YES), },
            };

            using (IndexWriter writer = new IndexWriter(directory, config))
                foreach (Document document in documents)
                    writer.AddDocument(document);

            using (DirectoryReader reader = DirectoryReader.Open(directory))
            {
                IndexSearcher searcher = new IndexSearcher(reader);
                TermQuery query = new TermQuery(new Term("Date", "01/02/04"));

                ScoreDoc[] hits = searcher.Search(query, 10).ScoreDocs;

                Assert.AreEqual(1, hits.Length);

                Document doc = searcher.Doc(hits.First().Doc);

                Assert.AreEqual("01/02/04", doc.Fields.FirstOrDefault(x => x.Name == "Date").GetStringValue());
            }
        }
    }
}