Я хотел бы реализовать полнотекстовый поиск в своем офлайновом (андроид), приложение для поиска пользователя генерировало список примечаний.
Я хотел бы, чтобы это вело себя точно так же, как Google (так как большинство людей уже привыкло к запросам к Google),
Мои начальные требования:
Как я могу настроить механизм полнотекстового поиска для поведения как можно больше как Google?
(Я главным образом интересуюсь Открытым исходным кодом, Java и в особенности Lucene),
Я думаю, что Люсин может удовлетворить ваши требования. Вы также должны рассмотреть возможность использования Solr, который имеет похожую функциональность и намного проще в настройке.
Я рассмотрю каждое требование отдельно, используя Lucene. Я считаю, что Solr имеет похожие механизмы.
- Быстро: как Google или как можно быстрее, имея 100000 документов по 200 сотен слов каждый.
Это разумный размер индекса, как для Lucene, так и для Solr, позволяющий получать данные за несколько десятков миллисекунд на запрос.
- Поиск двух слов должен возвращать только документы, содержащие оба слова (а не только одно слово) (если только не используется оператор "ИЛИ")
Это можно сделать, используя BooleanQuery с MUST по умолчанию в Lucene.
Следующие четыре требования можно обработать, настроив анализатор Lucene Analyzer:
- Case insensitive (так же известный как нормализация): Если у меня есть слово 'Hello' и я ищу 'hello', оно должно совпадать.
Для этого можно использовать LowerCaseFilterLowerCaseFilter.
- Diacritical mark insensitive: Если у меня есть слово "así", то поиск "asi" должен совпасть. В испанском языке многие люди, неправильно, либо не ставят диакритические знаки, либо неправильно их ставят.
Это требует нормализации Юникода с последующим удалением диакритических знаков. Для этого можно построить пользовательский анализатор.
- Удаление стоп-слова: Чтобы не иметь большого индекса бессмысленных слов типа 'и', 'the' или 'for' не следует индексировать вообще.
A StopFilter удаляет стоп-слова в Lucene.
- Замена словаря (так же известна как: стволовые слова): Аналогичные слова должны быть проиндексированы как единое целое. Например, слова "голодный" и "голодный" должны быть заменены на "голодный".
У Лусены много Снежных шариков. Один из них может подойти.
- Поиск фраз: Если у меня есть текст "Hello world!", то поиск "world hello" не должен совпадать с ним, а поиск "hello world" должен совпадать.
Это рассматривается специализированным запросом Lucene PhraseQuery.
Как вы видите, Lucene охватывает все необходимые функциональные возможности. Чтобы получить более общую картину, я предлагаю книгу Lucene in Action, The Apache Lucene Wiki или The Lucid Imagination Site.
.Многие из этих моделей поведения по умолчанию для Люсин. Первое (включая все термины) - нет, но вы можете заставить это поведение задать оператор по умолчанию:
MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
parser.setDefaultOperator(QueryParser.AND_OPERATOR);
Я знаю, что элементы 2, 4 и 6 возможны, а IIRC, они происходят по умолчанию. Я не уверен насчет пунктов 3 и 5, но Lucene предлагает тонну опций настройки, поэтому я бы предложил реализовать подтверждение концепции с вашими данными, чтобы проверить, соответствует ли она и этим требованиям.
.Купить Поисковое устройство Google . Или, как говорится в комментариях, используйте Lucene, как вы уже упоминали.
.Если вы не купите поисковик, у вас есть Lucene, Nutch, Apache Solr и некоторые другие.
.HyperSQL является чисто Java SQL реализацией, которая может быть запущена довольно легко, как и SQLite. Можно использовать их полнотекстовые возможности и запросы для воссоздания колеса, но, как отметили другие комментаторы, существующая реализация, пожалуй, лучше всего.
.