Lucene и Special Characters

Я использую Lucene. Сетевые 2.0 для индексации некоторых полей от таблицы базы данных. Одно из полей является полем 'Name', которое позволяет специальные символы. Когда я выполняю поиск, он не находит мой документ, который содержит термин со специальными символами.

Я индексирую свое поле как таковое:

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;

Если я выполняю поиск поля как 'Имя' и значение как 'Тест', это находит документ. Если я выполняю тот же поиск как 'Имя' и значение как 'Тест (Тест)', то это не находит документ.

Еще более странный, если я удаляю QueryParser. Строка Escape делает поиск GUID (который, конечно, содержит дефисы), она находит документы, где значение GUID соответствует, но выполнение того же поиска со значением как 'Тест (Тест)' все еще не приводит ни к каким результатам.

Я не уверен, что я делаю неправильно. Я использую QueryParser. Метод Escape для выхода из специальных символов и хранит поле и ищет Lucene. Примеры сети.

Какие-либо мысли?

9
задан Brandon 28 April 2010 в 20:45
поделиться

2 ответа

StandardAnalyzer удаляет специальные символы во время индексации. Вы можете передать список явных игнорируемых слов (исключая те, которые вы хотите указать).

5
ответ дан 4 December 2019 в 22:27
поделиться

При индексировании вы токенизировали поле. Итак, ваша входная строка создает два токена «test» и «test». Для поиска вы создаете запрос вручную, то есть используете TermQuery вместо QueryParser, который токенизировал бы поле.

Для всего матча необходимо проиндексировать поле UN_TOKENIZED. Здесь входная строка принимается как отдельный токен. Единственный токен создан «Тест (Test)». В этом случае ваш текущий поисковый код будет работать. Вы должны внимательно следить за регистром входной строки, чтобы убедиться, что если вы индексируете текст в нижнем регистре, вы должны делать то же самое при поиске.

Обычно рекомендуется использовать один и тот же анализатор при индексировании и поиске. Вы можете использовать KeywordAnalyer для создания одного токена из входной строки.

3
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: