C# 混合Lucene/MySQL查询或概念

C# 混合Lucene/MySQL查询或概念,c#,.net,mysql,lucene.net,C#,.net,Mysql,Lucene.net,我们的项目需要近实时搜索和不断更新。数据当前存储在MySQL数据库中,并且Lucene索引会随着数据库的修改而更新 我们目前有搜索能力,我们想要它。但是,我们正在尝试添加在索引/数据库中“标记”文档的功能。因为数据罐可以是数百万条记录,所以我们不想更新Lucene索引以进行标记(或者如果有一种方法可以批量更新Lucene也可以)。相反,我们在MySQL中有一个文档ID表,我们想用它来确定标记集 到目前为止,我发现最好的选择是以整数数组的形式检索两个ID列表,对它们进行排序(因此我只需要循环一次)

我们的项目需要近实时搜索和不断更新。数据当前存储在MySQL数据库中,并且Lucene索引会随着数据库的修改而更新

我们目前有搜索能力,我们想要它。但是,我们正在尝试添加在索引/数据库中“标记”文档的功能。因为数据罐可以是数百万条记录,所以我们不想更新Lucene索引以进行标记(或者如果有一种方法可以批量更新Lucene也可以)。相反,我们在MySQL中有一个文档ID表,我们想用它来确定标记集

到目前为止,我发现最好的选择是以整数数组的形式检索两个ID列表,对它们进行排序(因此我只需要循环一次),然后循环并查找两者之间的匹配项(尽管这并不理想,因为我们可能会丢失排序)

尝试在MySQL的“in”查询中使用Lucene ID列表失败,因为文档数量可能达到数百万,MySQL会被它阻塞

对我们如何优化或实现这一点有何见解

另一个建议是使用第二个索引和MutliSearcher,但我不完全确定如何执行该操作,因为在更新或删除标记集时仍需要使用可能的百万行更新索引。

对于“批量更新”,您不能基于MySql表中的时间戳或类似内容对Lucene索引执行增量更新吗?我在solr中完成了这项工作,而不是直接在Lucene中完成,但由于solr是Lucene功能的包装器,因此本质上是相同的(或者我假设是这样的…)


对于下面的所有内容,假设您没有足够的RAM来完全保存整个集合

索引技术是专门为读比写多得多的情况而设计的。最好先分析相应的频率,从而量化“不断更新”

如果更新频率太高,您可能希望尝试直接使用数据库系统处理这部分搜索(如果MySQL不执行这项工作,也有;响应速度将取决于数据库中的索引机制和内存中可用于缓存它们的内存)

否则,您可能需要研究Solr(它不仅仅是Lucene的一个简单包装器,因为它提供了额外的功能,这些功能可能是基于Solr的,但使用Lucene本身是不可用的)

特别是:

  • (即核心交换)
  • StreamingUpdateSolrServer
根据更新的批量大小和提交/优化的性能权衡,您可能可以使用不同的策略。对于大型批量更新,复制备用核心、批量更新、提交/优化和交换核心可能更容易。然而,它将不再是“近实时”(NRT);的想法是本地的,直接依赖于可用的RAM和集合大小