2012-06-24 2 views
3

Я использую Compass/Lucene для поиска и индексирования моей базы данных. Я хочу, чтобы диакритические символы и случай персонажа игнорировались при поиске, так что запрос «foo» соответствовал бы «Foo» и «foo», а запрос для «fóó» соответствовал бы «fóo» и «fOO».игнорировать диакритические знаки при поиске

Основываясь на том, что я прочитал, кажется, что мне нужно изменить анализатор по умолчанию, который использует Компас при индексировании и поиске в моем контексте. Я выяснил, где я использую анализатор, но я не могу найти реализацию анализатора, которая соответствует моим требованиям. Существует ли уже анализатор, который игнорирует диакритические знаки и характер, или мне нужно написать свои собственные?

ответ

5

Посмотрите на org.apache.lucene.analysis.ASCIIFoldingFilter, чтобы узнать, делает ли он то, что вы хотите. Если нет, я бы использовал его источник в качестве отправной точки для написания собственного.

Вы правы, что вы должны использовать ту же конфигурацию анализатора для индексирования и запросов, по той очевидной причине, что если вы раздели все диакритические из индекса, вы должны очистить их от любого запроса также.

Одна вещь, о которой нужно знать, - убедиться, что вы нормализуете какой-либо юникод где-то в процессе индексирования/запроса. Для справки см .: http://unicode.org/reports/tr15/, http://unicode.org/faq/normalization.html и http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html.

EDIT: Как указано в комментариях ниже, в качестве фильтра вы не можете использовать ASCIIFoldingFilter в качестве анализатора напрямую, однако есть прямые инструкции по включению его в анализатор здесь: stackoverflow.com/a/3834244/ 390153

EDIT: Как уже упоминалось @jspboix в приведенном ниже комментарии, вам также понадобится связать LowerCaseFilter, чтобы обработать случай символа.

+0

Я не думаю, что org.apache.lucene.analysis.ASCIIFoldingFilter будет решать мою проблему напрямую, потому что это не Анализатор, но может быть полезной отправной точкой –

+0

Нет, не напрямую, как это фильтр. Однако вы найдете краткий пример того, как включить его в анализатор здесь: http://stackoverflow.com/a/3834244/390153 – Recurse

+1

Вам также понадобится LoweCaseFilter для соответствия «fOO» с «foo». – jspboix

0

В моем приложении Grails, я использую для поиска плагин и только настроенную систему, чтобы использовать «немецкий» анализатор:

compassSettings = ['compass.engine.analyzer.default.type': 'German'] 

Это игнорирует по крайней мере, корпус и умляуты - «ä» хранится в виде " a "в индексе.

Я только что добавил «Fóo» и «Föo» в один из моих тестовых документов и искал «foo» - он находит «Föo», но не «Fóo». Поэтому я думаю, что если вы переключите язык на правильное значение (французский?), Он должен работать.

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