我正在使用 Lucene.Net 2.0 对数据库表中的某些字段进行索引。其中一个字段是允许特殊字符的“名称”字段。当我执行搜索时,它无法找到包含具有特殊字符的术语的文档。
我这样对字段进行索引:
Directory DALDirectory = FSDirectory.GetDirectory(@"C:\Indexes\Name", false);
Analyzer analyzer = new StandardAnalyzer();
IndexWriter indexWriter = new IndexWriter(DALDirectory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
Document doc = new Document();
doc.Add(new Field("Name", "Test (Test)", Field.Store.YES, Field.Index.TOKENIZED));
indexWriter.AddDocument(doc);
indexWriter.Optimize();
indexWriter.Close();
我想要搜索执行以下操作:
value = value.Trim().ToLower();
value = QueryParser.Escape(value);
Query searchQuery = new TermQuery(new Term(field, value));
Searcher searcher = new IndexSearcher(DALDirectory);
TopDocCollector collector = new TopDocCollector(searcher.MaxDoc());
searcher.Search(searchQuery, collector);
ScoreDoc[] hits = collector.TopDocs().scoreDocs;
如果我使用“Name”作为字段进行值为“Test”的搜索,则可以找到文档。但如果我使用相同的搜索条件,但将值更改为“Test(Test)”,则无法找到文档。更奇怪的是,如果我删除QueryParser.Escape行并搜索一个包含连字符的GUID(当然),它会找到GUID值匹配的文档,但是将值更改为“Test(Test)”进行相同的搜索仍然没有结果。
我不确定自己做错了什么。我正在使用QueryParser.Escape方法来转义特殊字符,并按照Lucene.Net的示例存储字段并进行搜索。你有什么想法吗?