Полнотекстовый поиск как Google

Я хотел бы реализовать полнотекстовый поиск в своем офлайновом (андроид), приложение для поиска пользователя генерировало список примечаний.

Я хотел бы, чтобы это вело себя точно так же, как Google (так как большинство людей уже привыкло к запросам к Google),

Мои начальные требования:

  • Быстро: как Google или максимально быстро, имея 100 000 документов с 200 сотнями слов каждый.
  • Поиск двух слов должен только возвратить документы, которые содержат оба слова (не всего одно слово) (если операция ИЛИ не используется),
  • Нечувствительный к регистру (иначе: нормализация): Если у меня есть слово 'Hello', и я ищу 'привет', оно должно соответствовать.
  • Нечувствительный диакритический знак: Если у меня есть слово 'así', поиск 'asi' должен соответствовать. В испанцах, многих людях, неправильно, или не вставляйте диакритические знаки или приводите правильно помещение к сбою их.
  • Устранение стоп-слова: Чтобы не иметь огромный индекс, бессмысленные слова как 'и', или 'для' не должны быть индексированы вообще.
  • Замена словаря (иначе: слова основы): Подобные слова должны быть индексированы как один. Например, экземпляры 'с жадностью' и 'голодный' должны быть заменены 'голодом'.
  • Фразовый поиск: Если у меня есть текст 'Привет мир!' поиск '"мира привет"' не должен соответствовать ему, но поиск '"привет, мир"' должен соответствовать.
  • Ищите все поля (в мультиполевых документах), если никакое поле не указало (не только поле по умолчанию)
  • Автозавершение в результатах поиска при вводе для предоставления популярных поисков. (точно так же, как Google Suggest)

Как я могу настроить механизм полнотекстового поиска для поведения как можно больше как Google?

(Я главным образом интересуюсь Открытым исходным кодом, Java и в особенности Lucene),

12
задан Eduardo 22 May 2010 в 09:48
поделиться

5 ответов

Я думаю, что Люсин может удовлетворить ваши требования. Вы также должны рассмотреть возможность использования 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.

.
15
ответ дан 2 December 2019 в 19:31
поделиться

Многие из этих моделей поведения по умолчанию для Люсин. Первое (включая все термины) - нет, но вы можете заставить это поведение задать оператор по умолчанию:

MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, new StandardAnalyzer());
parser.setDefaultOperator(QueryParser.AND_OPERATOR);

Я знаю, что элементы 2, 4 и 6 возможны, а IIRC, они происходят по умолчанию. Я не уверен насчет пунктов 3 и 5, но Lucene предлагает тонну опций настройки, поэтому я бы предложил реализовать подтверждение концепции с вашими данными, чтобы проверить, соответствует ли она и этим требованиям.

.
3
ответ дан 2 December 2019 в 19:31
поделиться

Купить Поисковое устройство Google . Или, как говорится в комментариях, используйте Lucene, как вы уже упоминали.

.
1
ответ дан 2 December 2019 в 19:31
поделиться

Если вы не купите поисковик, у вас есть Lucene, Nutch, Apache Solr и некоторые другие.

.
-1
ответ дан 2 December 2019 в 19:31
поделиться

HyperSQL является чисто Java SQL реализацией, которая может быть запущена довольно легко, как и SQLite. Можно использовать их полнотекстовые возможности и запросы для воссоздания колеса, но, как отметили другие комментаторы, существующая реализация, пожалуй, лучше всего.

.
0
ответ дан 2 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

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