2014-11-13 1 views
0

В результате нечеткого совпадения я хочу найти документы, имеющие 60-70% совпадений слов из списка слов в запросе.Whoosh нечеткое соответствие запрошенного списка слов

Например:

>> #(Query string as passed by user) 
>> query = i am searching for a document that is matched fuzzily with what i am giving here. 
>> QueryParser("content", ix.schema).parse(query) 

Этот запрос будет искать документы со всеми словами, но я хочу, чтобы найти все те документы, которые содержат, по меньшей мере, 60% или более из указанных выше слов.

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

ответ

0

Это похоже Not implemented yet в Whoosh (Проверен 28/05/2015).

Однако в документации [whoosh.query.Or][1], имеется ссылка на minmatch аргумента:

класса whoosh.query.Or (подзапросов, импульс = 1,0, minmatch = 0, шкала = None)

Параметры:

  • подзапросы - список объектов запроса для поиска.

  • boost - коэффициент усиления, применяемый к совокупности всех соответствующих документов.

  • minmatch - еще не реализована.

  • шкала - коэффициент масштабирования для «бонуса координации». Если это значение не равно None, оно должно быть числом с плавающей запятой больше 0 и меньше 1. Оценки соответствующих документов накапливаются/наказываются в зависимости от количества условий запроса, согласованных в документе. Это число увеличивает эффект бонусов.

Если мы должны minmatch это минимальные совпадающие ключевые слова, так что решение whould быть как

from math import ceil 
from whoosh.query import Or, Term 
raw_query = "i am searching for a document that is matched fuzzily with what i am giving here." 
min_ratio = ceil(len(raw_query) * 3.0/5.0) 
query = Or([Term("content", word) for word in raw_query.split()], minmatch = min_ratio) 

В этом случае, вы должны игнорировать прекратить фильтрацию или вы должны отфильтровать стоп-слова из запроса, прежде чем вычисление длины запроса.