我创建了一个带有字段(id,title,url,content)的索引,用于通过抓取来存储网页信息。现在我想用多个单词查询(也是布尔查询)搜索该索引,建议好的高效搜索算法(一些例子)和有效的解析。请帮忙
答案 0 :(得分:0)
您是否只想搜索标题或内容? 假设您希望允许对标题进行部分搜索,该标题返回URL和/或内容,则架构将为:
schema = Schema(id=ID(stored=True), title=NGRAM(minsize=2, maxsize=20,stored=True, sortable=ranking_col), url=STORED(), content=STORED())
这适用于标准的Whoosh搜索者,最多可达~1000000个标题。对于更多条目,ngram索引将变得非常大且缓慢。
另外,使用停用词来缩小索引大小:
stopwords = set(['of', 'by', 'the','in','for','a']) #words to be excluded from the index
def create_whoosh(self):
writer = ix.writer()
for t in documents:
words = [t for t in t.title.split(" ") if t not in stopwords] #remove stopwords
writer.add_document(title=" ".join(words), url=t.url, content=t.content)
writer.commit()
搜索者:
def lookup(self, terms):
with ix.searcher() as src:
query = QueryParser("term", ix.schema).parse(terms)
results = src.search(query, limit=30)
return [[r['url'],r['content']] for r in results]
如果要搜索标题和内容中的完整单词,您可以执行以下操作:
schema = Schema(id=ID(stored=True), title=TEXT(stored=True), url=STORED(), content=TEXT(stored=True))
这不适用于子字符串搜索,但可以很好地处理一些数百万的文档(取决于内容的大小)
要索引~10万个文档,您需要将内容分别存储在某种数据库中,并仅使用whoosh查找ID。