Я думаю, вам следует применить комбинацию методов.
1) Для распространенных вариантов написания я бы выбрал метод, основанный на словаре.Так как они распространены, я не буду беспокоиться о пропущенных словарных словах.Это должно решить проблему цвета / цвета.
2) Для опечаток и других нестандартных вариантов написания вы можете применить алгоритм Metaphone (http://en.wikipedia.org/wiki/Metaphone)) для преобразования токенов в представление их английского произношения. Подобные варианты звучатаналогично, таким образом вы можете сопоставить их друг с другом (например, от Джона до Джона). Вы также можете использовать алгоритмы сопоставления на основе расстояния редактирования во время запроса, чтобы сопоставить очень похожие токены только с парой символов, расположенных рядом или с пропущенными символами (например, Huseyin против Housein).
3) Для апострофов и составных слов с дефисом между ними можно сохранить оба варианта.Например, «Джон» будет индексироваться как «Джон с» и «Джонс».«Пробел» может быть преобразован (или сохранен вместе) в «Пробел» и «Пробел».
4) Для составных слов без дефиса между ними вы можете использовать внешнюю библиотеку, такую как HyphenationCompoundWordTokenFilterFactoryкласс Solr (http://lucene.apache.org/solr/api/org/apache/solr/analysis/HyphenationCompoundWordTokenFilterFactory.html). Хотя он может использовать словарь, он не обязан. Он предназначен для работы со сложными словами, которые часто встречаются в немецком и аналогичных языках. Я не вижу причин, почему вы не можете применить егона английский (вам нужно будет предоставить английский словарь и файлы правил переносов).
На самом деле, последний вопрос поднимает важный вопрос. Я не думаю, что вам нужно создавать собственную библиотеку поиска с нуля.Если это правда, почему бы вам не использовать Lucene (или Solr, основанный на Lucene), библиотеку поиска на основе Java, в которой уже есть методы и способы решения этих проблем? Например, метод внедрения позволяетиндексировать как цвет, так и цвет в одном и том же месте документа, поэтому не имеет значения, гдеВы также ищете «цветные машины» или «цветные машины» (при условии, что вы позаботитесь о том, чтобы остановить).Есть фильтры, которые выполняют фонетическую индексацию (http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html). Существует даже компонент FuzzyQuery, который позволяет вам разрешить определенное количество расстояний редактирования для соответствия аналогичным терминам (http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/search/FuzzyQuery.html)
. Вам также необходимо решить, в какой точке выЯ хочу решить эти проблемы: один из крайних подходов - индексировать все возможные варианты этих терминов во время индексации и использовать запросы такими, как они есть. Это обеспечит простоту обработки запросов, но обойдется вам в больший индекс (поскольку всеварианты, которые вам нужно хранить.) Другой крайний случай - индексировать документы такими, как они есть, и расширять запросы во время поиска. Это позволит вам поддерживать индекс на низком уровне за счет более сложной обработки запросов. Фонетическая индексация потребует от вас обработкии ваши документы во время индексации, и запросы во время поиска. Нечеткое сопоставление будет возможно только во время поиска, потому что, по-видимому, вы не сможете сохранить все варианты редактирования всех терминов в индексе.