Я использую Lucene.Net 2.0 для индексации некоторых полей из таблицы базы данных. Одним из полей является поле «Имя», которое позволяет использовать специальные символы. Когда я выполняю поиск, он не находит мой документ, содержащий термин со специальными символами.Lucene и специальные символы
индекс I мое поле, как, например:
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;
Если я выполнить поиск поля, как 'Имя' и значения, как 'Test', он находит документ. Если я выполняю тот же поиск, что и «Имя», а значение «Тест (тест)», то он не находит документ.
Еще более странно, если я удаляю строку QueryParser.Escape, ищу поиск GUID (который, конечно, содержит дефисы), он находит документы, в которых совпадает значение GUID, но выполняет тот же поиск со значением как ' Test (Test) "по-прежнему не дает никаких результатов.
Я не уверен, что я делаю неправильно. Я использую метод QueryParser.Escape, чтобы избежать специальных символов и сохраняю поле и поиск по примерам Lucene.Net.
Любые мысли?
Должен ли я использовать другой анализатор для достижения моей цели? А как насчет переключения между Tokenized на Un_Tokenized при хранении полей со специальными символами? – Brandon
хорошо, если вы не обозначаете поле, вы не можете «искать» на нем. У вас есть пара вариантов, чтобы написать собственный анализатор (очень простой) или передать список остановочных слов в StandardAnalyzer. что-то вроде: Hashtable htStopwords = new Hashtable(); Анализатор анализатора = новый стандартАнализатор (htStopwords); – Mikos
вы также можете посмотреть StopAnalyzer или SimpleAnalyzer ... они могут помочь. Проблема в том, что у вас может быть много шумовых слов. Но если это не проблема. – Mikos