Анализаторы в Lucene.NET
В предыдущих статьях я описал основы Lucene.NET и язык запросов. В этой статье хотел бы остановиться на анализаторах в Lucene.NET, необходимых для создания индекса и поиска по нему.
Для начала приведу пример из первой статьи:
- Analyzer analyzer = new StandardAnalyzer();
- IndexWriter writer = new IndexWriter("tmp", analyzer);
- for (int i = 0; i < 1000000; i++)
- {
- Document doc = new Document();
- doc.Add(
- new Field(
- "id",
- i.ToString(),
- Field.Store.YES,
- Field.Index.NO));
- doc.Add(
- new Field(
- "text",
- string.Format("{0} string.", i),
- Field.Store.YES,
- Field.Index.TOKENIZED));
- writer.AddDocument(doc);
- if (i % 100000 == 0)
- Console.WriteLine(
- "[{1}]: {0} documents are saved.",
- i,
- DateTime.Now);
- }
- writer.Optimize();
- writer.Close();
* This source code was highlighted with Source Code Highlighter.
Как видно из первой строки, для построения индекса нам необходим Analyzer, давайте рассмотрим, что это и для чего нужен.
Анализатор используется для разбора, разбивки и индексирования ваших данных. Lucene поставляется с несколькими Analyzer’ами, но StandardAnalyzer является наиболее простым и часто используемым. Он производит несколько операций над вашим текстом, включая удаление слов из стоп-листа, пунктуации. StandardAnalyzer понимает английскую пунктуацию, имеет встроенный стоп-лист, а также производит сравнение без учета регистра символов.
Еще один полезный анализатор, но который не входит в поставку Lucene.NET – SnowballAnalyzers. Он удаляет префиксы и суффиксы и позволяет добиться лучших результатов поиска, но насколько я понимаю, делает это он только над английским текстом.
Остальные анализаторы, входящие в состав Lucene.NET:
- KeywordAnalyzer – данный анализатор рассматривает всю индексируемую строку как один терм. Используется для индексирования различных названий, идентификаторов, и совсем нежелательно использовать его для больших кусков текста.
- WhitespaceAnalyzer – похож на StandardAnalyzer, но не учитывает пунктуацию и разбивает слова разделенные пробелами. Данный анализатор не имеет стоп-листа.
- StopAnalyzer – также похож на StandardAnalyzer, знает английский слова, которые необходимо игнорировать. Вот список этих слов:
"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"
- PerFieldAnalyzerWrapper – данный анализатор используется, когда вы хотите использовать различные анализаторы для разных полей. При создании данного анализатора указывается анализатор по умолчанию, а потом при помощи метода AddAnalyzer можете указывать различные анализаторы для различных полей вашего документа.
Для большинства случаев данных анализаторов хватит, но если по каким-то причинам они вам не подходят, то вы всегда можете написать свой собственный, унаследовав его от базового Analyzer. Описание того, как это можно сделать можете посмотреть здесь.
Из исходников Lucene 1.9.2 можно выдрать RussianAnalyzer и собрать вместе с ним последнюю версию, тогда будет и русская морфология.
А имеется ввиду Lucene родной или портированная версия? просто в оригинальном Lucene этот класс и в последней версии есть, т.е. не только в 1.9.2.
Ищу подходящий Search Engine.
1) Можно ли в Lucene.net организовать индекс сразу по двум языкам? Например есть таблица в БД по полю “Text” нужно искать с учётом английского и русского языка?
2) Есть ли возможность расширять словари языков новыми словоформами?
Спасибо.
1. Проблем не должно возникнуть, кроме того, что Analyzer будет учитывать особенности одного языка.
2. На сколько я знаю, если вам необходимо что-то расширить, поменять логику, то вам необходимо написать собственный Analyzer, который будет это всё делать. Соответственно можно написать и Analyzer, который будет учитывать особенности английского и русского языка.