Расширенные символы (европейские) в ASCII США для индексации поиска

Я ищу таблицу или эвристическую библиотеку, которая может преобразовывать расширенные символы, такие как o со шляпой над ним, в обычный ascii o.

Я хочу сделать это для целей индексации поиска, так как большинство людей не будут печатать o вместе со шляпой.

Например, я ввожу в поиск «Cote», но хочу, чтобы мой поиск включал такие вещи, как «Côte».

Похоже, Solr не конвертирует их. Я попробовал java.text.Normalizer и friends, но это не сработало. сработало, см. решение ниже.


person Adam Gent    schedule 26.03.2011    source источник
comment
Похоже, я мог бы использовать первый символ в кодовой точке в качестве эвристики: unicode.org/reports/ тр15   -  person Adam Gent    schedule 26.03.2011
comment
Черт, похоже, я просто собираюсь сделать гигантский картографический стол.   -  person Adam Gent    schedule 26.03.2011


Ответы (4)


Вы хотите использовать ASCIIFoldingFilterFactory при индексировании и запросе анализ в Solr. Если вам нужна эта автономная версия, вы можете просто взять исходный код и делать все, что он делает.

person tddmonkey    schedule 30.03.2011
comment
Не знаю, как я пропустил этот фильтр. Мне придется заменить мой хак этим. - person Adam Gent; 31.03.2011

Я быстро погуглил и действительно не нашел доступных библиотек, которые будут выполнять перевод символов. Хотя я мог что-то упустить.

Я нашел solr javadoc для всех их фабричных классов:
http://lucene.apache.org/solr/api/org/apache/solr/analysis/package-summary.html

Я уверен, что вы уже видели вышеизложенное, но, возможно, там есть что-то, что вы можете использовать.

Мое личное предложение состоит в том, что вам придется написать свой фильтр. Что, я не думаю, будет очень легко. Если вы принимаете только юникод, все будет проще, но если вы используете веб-приложение, вам придется беспокоиться о наборе символов, поступающем из браузера вашего пользователя, а затем преобразовать этот набор символов в юникод.

Удачи.

person hooknc    schedule 26.03.2011
comment
Я сделал, но похоже, что это многообещающе: « title = «как я могу изменить расширенные латинские символы на их эквиваленты ascii без ударения»> stackoverflow.com/questions/450026/ - person Adam Gent; 26.03.2011

Похоже, это работает:

import java.text.Normalizer;

Normalizer.normalize("ô", Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]","");
person Adam Gent    schedule 26.03.2011

У вас правильная общая идея, но неправильный конкретный подход.

Обратите внимание, что во многих европейских языках удалять акценты — очень плохая идея. Люди печатают их по какой-то причине. Очень разные слова отличаются только ударением. «папа» — это не то же самое, что «папа». Даже не близко. Пользователи этих языков рассчитывают вводить их и получать результаты поиска, соответствующие различиям.

Во-вторых, в этой области уже много работы. См. lucene.apache.org, где есть набор фильтров токенов, которые делают множество вещей, которые вам могут понадобиться или не понадобиться.

Существуют также коммерческие предложения с другими потенциально полезными функциями, такими как отображение «бега» на «бег» и все такое.

Если вы действительно уверены, что хотите это сделать, сначала нормализуйте текст до «разложившегося» (NFKD), а затем просто удалите акценты. Виола (å).

person bmargulies    schedule 26.03.2011
comment
в то время как я в целом согласен с вами, что в большинстве случаев я должен лучше представлять различие для этого случая, я имею дело в основном с американцами, которые ищут продукты (см. мой сайт evocatus.com) Я индексирую обе комбинации правописания. Большинство сайтов электронной коммерции, таких как Amazon, даже удаляют символы в презентации продуктов. Я, по крайней мере, сохраняю правильное написание при расширении поиска, но, к сожалению, даю больше ложных срабатываний. - person Adam Gent; 26.03.2011