Whoosh 近距离搜索

Whoosh Proxmity search

我想知道,如何使用 Whoosh 进行邻近搜索。我已经阅读了 whoosh 的文档。文档中写到使用class whoosh.query.Phrase(fieldname, words, slop=1, boost=1.0, char_ranges=None)一次就可以使用邻近搜索。

例如,我需要在索引中找到 "Hello World",但是 "Hello" 应该与单词 "World" 有 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)) 

大佬们,请教一下如何使用class whoosh.query.Phrase(fieldname, words, slop=1, boost=1.0, char_ranges=None)'使用邻近搜索并改变单词之间的距离。 提前致谢

你想要的是 slop 系数 5。

几点:

  1. 搜索时,必须传递查询(q),而不是查询解析器(qp)results = s.search(q, limit=5)

  2. limit是指最大文件数到return,不是slop因子。您的 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)