Whoosh поиск Proxmity - PullRequest
       46

Whoosh поиск Proxmity

0 голосов
/ 25 октября 2018

Я хотел бы знать, как использовать поиск близости с свистом.Я прочитал документацию свист.В документе было написано, что с помощью class whoosh.query.Phrase(fieldname, words, slop=1, boost=1.0, char_ranges=None) один раз можно использовать поиск по близости. Например,

, мне нужно найти «Hello World» в индексе, но «Hello» должен иметь 5-расстояние до слова «мир».

На данный момент я использую следующий код и он работает нормально с обычным парсером.

from whoosh.query import *
from whoosh import qparser

index_path = "/home/abhi/Desktop/CLIR/indexdir_test"

ix = open_dir(index_path)

query='Hello World'

ana = StandardAnalyzer(stoplist=stop_word)


qp = QueryParser("content", schema=ix.schema,termclass=Phrase)
q=qp.parse(query)
with ix.searcher() as s:
   results = s.search(qp,limit=5)
   for result in results:
       print(result['content']+result['title'])
       print (result.score)
   print(len(results)) 

Ребята, пожалуйста, помогите мне, как использовать класс whoosh.query.Phrase (имя поля, слова, slop = 1, boost = 1.0, char_ranges = None) ', чтобы использовать поиск близости и изменяетрасстояние между словами.Заранее спасибо

1 Ответ

0 голосов
/ 09 марта 2019

То, что вы хотите, - это slop множитель 5.

Несколько баллов:

  1. При поиске вы должны пройти запрос(q), а не анализатор запросов (qp): results = s.search(q, limit=5)

  2. limit относится к максимальному количеству документов для возврата, а не к коэффициенту проскальзывания.Ваш параметр limit=5 говорит о том, что вы хотите получить до 5 результатов поиска (если вы думали, что это отстой).

  3. Вы можете удалить termclass=Phrase

Вы можете создать запрос фразы двумя способами:

  1. Используя строку запроса.Хорошо подходит для передачи пользовательского запроса.Добавьте ~ и коэффициент наклона к фразе для поиска близости.Если вы хотите, чтобы словосочетания содержали до 5 слов друг от друга: "hello world"~5
  2. Используя запрос SpanNear2.Позволяет программно структурировать его так, как вы хотите.Передайте все термины вашей фразы в виде массива Term объектов и укажите slop в качестве параметра конструктора.
from whoosh.query import spans

with ix.searcher() as s:

# Option 1: Query string
  query   = '"Hello World"~5'
  qp      = QueryParser("content", schema=ix.schema)
  q       = qp.parse(query)
  results = s.search(q, limit=5)

# Option 2: SpanNear2
  q = spans.SpanNear2([Term("content", "Hello"), Term("content", "world")], slop=5)
  results = s.search(q, limit=5)

...