擅长:python、mysql、java
<p>解决这个问题的工作量与您正在处理的<em>存储查询的数量直接相关。在</p>
<p>20多年前,我们通过将存储查询视为minidocs并根据所有<em>必须包含</em>和<em>可能包含</em>的术语对其进行索引,从而处理<em>存储查询。一个新文档的术语列表被用作对这个“查询数据库”的一种查询,它建立了一个<em>可能</em>要运行的有趣搜索的列表,然后只对新文档运行这些搜索。这听起来可能很复杂,但当有多个<em>存储的查询</em>(比如10000到1000000个或更多)并且您有一个支持布尔和基于相似性的混合搜索的复杂查询语言时,它大大减少了我们必须执行的查询的数量,通常不超过10或15个查询。在</p>
<p>有一件事帮助我们控制了整件事的<a href="http://en.wikipedia.org/wiki/The_Outer_Limits_%281963_TV_series%29" rel="nofollow noreferrer">horizontal and the vertical</a>。我们使用我们的查询解析器来构建一个解析树,这个解析树用于构建我们索引查询所依据的必须/可能具有的术语列表。我们警告客户不要在存储的查询中使用某些类型的通配符,因为这可能会导致所选查询数量的爆炸性增长。在</p>
<p><strong>更新评论:</strong></p>
<p>简而言之:我不确定。在</p>
<p>更详细的回答是:我们正在处理一个定制的文本搜索引擎,它的部分查询语法允许以某种方式非常有效地对doc集合进行切片,特别强调<code>date_added</code>。我们玩了很多游戏,因为我们每天要接收4-10000000个新文档,并在DEC Alphas上运行这些文档来处理多达1000000多个存储的查询,内存为64MB。(这是80年代末90年代初)</p>
<p>我猜,对<code>date_added</code>等效的过滤可以与您上次运行查询的日期结合使用,或者可能是上次查询运行时的最高值{<cd3>}。如果需要对修改过的记录重新运行查询,可以将其<code>id</code>作为查询的一部分。在</p>
<p>我想说得更具体,你需要更具体地了解你到底想解决什么问题,以及你要完成的解决方案的规模。在</p>