лучшие практики для текстового поиска в базе данных - PullRequest
1 голос
/ 23 января 2012

У меня есть приложение, в котором мне нужно искать в различных текстовых полях. Приложение разработано с использованием NHibernate в качестве ORM.

Я хотел бы реализовать Porter Stemming в поиске, чтобы иметь возможность возвращать релевантные результаты, даже если ключевое слово соответствует аналогичному слову, например, описание продукта содержит memories, а ключевое слово для поиска - memory .

Может кто-нибудь предложить лучшие практики для таких типов поиска? Первая идея, которая приходит на ум, - это сохранить в базе данных две версии одного и того же поля, например:

Description
Description_Search

В столбце Description будет текст, введенный администратором сайта, и текст, видимый в веб-интерфейсе.

Description_Search будет содержать тот же текст, но пропущенный через алгоритм Портера-Стемминга. Тогда поисковые запросы будут основываться на поле Description_Search, а не Description.

Имеет ли это смысл? Это пустая трата пространства, когда нужно хранить две версии одного и того же текста?

Кроме того, Lucene.Net поможет в таком случае? Я также изучаю возможность интеграции Lucene.Net для полнотекстового поиска, но пока не рассматривал его подробно.

Заранее спасибо!

1 Ответ

0 голосов
/ 22 августа 2012

Для этого не нужно использовать два поля, одного будет достаточно. Поле имеет два «значения», одно сохраненное, которое можно получить с помощью Document.Get(...), и одно индексированное, которое используется для поиска. Технически также не требуется хранить значения, обычное решение - хранить идентификатор, который используется для поиска исходного содержимого в базе данных. Это также позволит вам найти дополнительную информацию, такую ​​как информация об авторе и местонахождение документа.

Lucene.Net поможет в этом случае, но он требует, чтобы вы сами написали инфраструктуру. Вам необходимо позаботиться о настройке анализаторов (обычно ничего не настраивать) и проиндексировать содержимое. Как упомянуто в комментарии, вы можете использовать функцию полнотекстового поиска SQL Server, но сама она имеет некоторые ограничения (которые могут вас не затронуть).

Одна большая проблема, с которой я столкнулся при использовании FTS в SQL Server, но работает в Lucene.Net (это не совсем справедливо, поскольку вы можете делать почти все в Lucene.Net, поскольку вы пишете код, который это делает), это чувствительность к акценту , Я не смог настроить его, используя правила шведского языка, где åäö следует рассматривать как реальные символы. Включение чувствительности к акценту сделало бы это, но это также означало бы, что диакритические знаки анализируются как реальные символы, что означает, что ñ отличается от n. (Представьте, что вы ищете «халапеньо» и не получаете совпадений с «халапеньо»). Отключение чувствительности к акценту в основном удаляет все диакритические знаки, превращая åäö в aao, и слова оказываются совершенно разными.

Запись вещей в Lucene.Net (по сравнению с SQL Server FTS) позволяет вам выделить результаты (представить, какие фразы в документе соответствуют запросу), выполнить поиск похожих документов, проверку орфографии, повышение пользовательских результатов, фасеты, и другие вещи, которые улучшат возможности поиска ваших пользователей.

...