2015-12-30 1 views
0

У меня есть словарь строк (7 миллионов строк). У меня есть список запросов/строк (30 миллионов строк), которые я хочу запустить против словаря.Самый быстрый словарь на основе редактирования расстояние

Я хочу, чтобы все словарные совпадения имели расстояние редактирования 1 или 2 для заданного запроса.

В настоящее время я использую solr для этого. Я проиндексировал 7 миллионов строк в solr (размер индекса 2GB). Я использую функцию strdist() для получения совпадений. Но этот подход в среднем составляет от 300 до 500 мс для каждого запроса. Для завершения 30 миллионов запросов потребуется 104 дня.

Я также попытался использовать метод solr MMapDirectory, но я не нашел разницы в производительности. Я попытался увеличить documentCache, queryResultCache, но он не улучшил производительность.

Могу ли я улучшить эту производительность до 1 мс, используя solr или любой другой подход, отличный от solr? Есть ли лучший вариант, чем solr?

ответ

0

Попробуйте использовать вместо этого fuzzy search support. Он использует расстояние редактирования в качестве основного сравнения и поддерживает расстояния редактирования до 2 (что должно быть достаточно для ваших нужд).

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

+0

Мой словарь и запрос содержат строки из нескольких слов. В этом случае нечеткий поиск не работает. Например, у меня есть _Google Corporation_ в моем индексе, а мой запрос - _Google Corportion_. Когда я запускаю этот запрос, я ожидаю, что он будет соответствовать этой записи в словаре, поскольку это расстояние редактирования 1. В этом случае нельзя применять нечеткий поиск. –

+0

Почему нельзя использовать нечеткий поиск в этом случае? – MatsLindh

+0

Я хочу отредактировать расстояние для полной строки, а не для отдельных слов в строке. Различные способы, которыми я могу применить расстояние редактирования, это 1. _Google Corporion ~ 1_: соответствует элементам, таким как _sony corporation_, _microsoft corporation_ и т. Д. 2. _Google ~ 1 Corportion ~ 1_: Он также соответствует элементам, таким как _sony corporation_, microsoft corporation_ и т. Д. 3. «_Google Corportion_ «~ 1: это будет делать поиск по близости –