Python 使用whoosh作为不带索引的匹配器

Python 使用whoosh作为不带索引的匹配器,python,matcher,whoosh,Python,Matcher,Whoosh,有没有可能在不建立索引的情况下使用whoosh作为匹配器 我的情况是,我使用字符串预定义订阅,并且文档以流的形式传递。我检查每个文档是否与订阅匹配,如果匹配,则发送它们。我不需要存储文档,也不需要在以后调用它们。一旦它们被发送到订阅,它们就可以被丢弃 目前只使用简单的匹配,但当消费者要求基于字段和/或逻辑等进行搜索时,我想知道是否可以使用whoosh匹配器并允许使用whoosh查询语法 我可以为每个文档建立一个索引,查询它,然后扔掉它,但这似乎非常浪费,是否可以直接构建一个匹配器?我在网上找不到

有没有可能在不建立索引的情况下使用whoosh作为匹配器

我的情况是,我使用字符串预定义订阅,并且文档以流的形式传递。我检查每个文档是否与订阅匹配,如果匹配,则发送它们。我不需要存储文档,也不需要在以后调用它们。一旦它们被发送到订阅,它们就可以被丢弃

目前只使用简单的匹配,但当消费者要求基于字段和/或逻辑等进行搜索时,我想知道是否可以使用whoosh匹配器并允许使用whoosh查询语法

我可以为每个文档建立一个索引,查询它,然后扔掉它,但这似乎非常浪费,是否可以直接构建一个匹配器?我在网上找不到任何文件或问题来说明如何做到这一点,我的尝试也没有成功。
或者,对于这项任务来说,这是一个错误的库吗?是否有更合适的库?

简单的答案是否定的

搜索索引和匹配器的工作方式完全不同。例如,如果搜索短语“hello world”,匹配器只需检查文档文本是否包含子字符串“hello world”。搜索索引无法做到这一点,它必须检查每个文档,这将非常缓慢

添加文档时,文档中的每个单词都会添加到该单词的索引中。因此,“hello”的索引将表示文档1在位置0处匹配,“world”的索引将表示文档1在位置6处匹配。搜索“hello world”将在“hello”索引中找到所有文档ID,然后在“world”索引中找到所有文档ID,并查看是否有文档ID在“hello”位置后6位的“world”位置

所以这是一个完全正交的方式做事情在呼呼声对一个匹配

可以对每个文档使用一个新的索引来实现这一点,如下所示:

def matches_subscription(doc: Document, q: Query) -> bool:
    with RamStorage() as store:
        ix = store.create_index(schema)
        writer = ix.writer()
        writer.add_document(
            title=doc.title,
            description=doc.description,
            keywords=doc.keywords
        )
        writer.commit()
        with ix.searcher() as searcher:
            results = searcher.search(q)
            return bool(results)
每次检查大约需要800毫秒,这相当慢


更好的解决方案是使用pyparsing、anbd构建一个解析器,然后创建自己的嵌套查询类,这些类可以进行匹配,更好地适合特定的搜索查询。那样的话,它也可以扩展。这可以使它降低到约40微秒,因此速度提高20000倍。

简单的答案是否定的

搜索索引和匹配器的工作方式完全不同。例如,如果搜索短语“hello world”,匹配器只需检查文档文本是否包含子字符串“hello world”。搜索索引无法做到这一点,它必须检查每个文档,这将非常缓慢

添加文档时,文档中的每个单词都会添加到该单词的索引中。因此,“hello”的索引将表示文档1在位置0处匹配,“world”的索引将表示文档1在位置6处匹配。搜索“hello world”将在“hello”索引中找到所有文档ID,然后在“world”索引中找到所有文档ID,并查看是否有文档ID在“hello”位置后6位的“world”位置

所以这是一个完全正交的方式做事情在呼呼声对一个匹配

可以对每个文档使用一个新的索引来实现这一点,如下所示:

def matches_subscription(doc: Document, q: Query) -> bool:
    with RamStorage() as store:
        ix = store.create_index(schema)
        writer = ix.writer()
        writer.add_document(
            title=doc.title,
            description=doc.description,
            keywords=doc.keywords
        )
        writer.commit()
        with ix.searcher() as searcher:
            results = searcher.search(q)
            return bool(results)
每次检查大约需要800毫秒,这相当慢

更好的解决方案是使用pyparsing、anbd构建一个解析器,然后创建自己的嵌套查询类,这些类可以进行匹配,更好地适合特定的搜索查询。那样的话,它也可以扩展。这可以使它下降到约40微秒,因此,速度要快20000倍