2010-04-28 3 views
9

Я использую 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.

Любые мысли?

ответ

5

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

+0

Должен ли я использовать другой анализатор для достижения моей цели? А как насчет переключения между Tokenized на Un_Tokenized при хранении полей со специальными символами? – Brandon

+0

хорошо, если вы не обозначаете поле, вы не можете «искать» на нем. У вас есть пара вариантов, чтобы написать собственный анализатор (очень простой) или передать список остановочных слов в StandardAnalyzer. что-то вроде: Hashtable htStopwords = new Hashtable(); Анализатор анализатора = новый стандартАнализатор (htStopwords); – Mikos

+0

вы также можете посмотреть StopAnalyzer или SimpleAnalyzer ... они могут помочь. Проблема в том, что у вас может быть много шумовых слов. Но если это не проблема. – Mikos

3

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

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

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

Смежные вопросы