Lucene: поиск в поиске с помощью FuzzyQuery - PullRequest
1 голос
/ 12 октября 2010

Мне нужно сделать FuzzyQuery , используя индекс, содержащий около 8 миллионов строк.Этот тип запроса довольно медленный, на каждое совпадение требуется около 20 секунд.Дело в том, что я могу сузить результаты, используя другое поле, до 5000 просмотров, прежде чем выполнять нечеткий поиск.Чтобы это работало, я должен сначала выполнить поиск по «более узкому» полю, а затем использовать нечеткий поиск в этих результатах.

Согласно lucene FAQ ,единственное, что мне нужно сделать, это BooleanQuery , где требуется более узкое значение ( BooleanClause.Occur.MUST в люцене 3).

Теперь у меня естьпробовал два разных подхода:

a) Использование парсера запросов, с вводом типа: narrower:+narrowing_text fuzzy:fuzzy_text~0.9

b) Построение BooleanQuery с TermQuery и FuzzyQuery

Ни одна не работала, я получаю примерно то же самое время, что и те, когда более узкий не используется.

Кроме того, просто для того, чтобы проверить, что, если сужение работает, времена должны быть намного лучше, я переиндексировал только 5000 элементов, которые соответствуют более узкому, и поиск пошел быстро, как ад.

На случай, если кому-то интересно, я использую пилюцен 3.0.2.

1 Ответ

2 голосов
/ 12 октября 2010

Doppleganger, вы, вероятно, можете использовать Filter , в частности, QueryWrapperFilter . Следуйте примеру из Lucene в действии . Возможно, вам придется внести некоторые изменения для использования в Python, но в противном случае это должно быть просто:

  1. Создайте запрос, который сузит его до 5000 обращений.
  2. Используйте его для создания QueryWrapperFilter.
  3. Использовать фильтр в поиске по нечеткому запросу.
...