【问题标题】:Lucene.Net and Nhibernate.Search: how to manage complex searches?Lucene.Net 和 Nhibernate.Search:如何管理复杂的搜索?
【发布时间】:2010-10-19 08:48:41
【问题描述】:

我们有一个 SQL Server 数据库,其中包含由 Lucene.netNhibernate.Search 索引的数百万条记录。当我们为我们的类建立索引时,我们试图扩展,因为索引/检索的成本非常小。目标是在带有分页的网页上为用户提供全文搜索。

由于 SQL Server 在向其发送太多参数时会抱怨(默认为 2100 个参数),并且由于我们不想在每次达到限制时都更改该参数(这很容易发生,所以我们文档中的某些术语非常常见但必须是可搜索的)我们决定在 Lucene 中处理从排序到分页的所有事情。它就像一个魅力。

然而,最近,特性蠕变给我们带来了一些问题,因为新查询不仅需要访问未编入索引的字段,还需要访问不应访问或无法访问的字段:计算字段、推荐列表等...

既然我们已经把所有的分页和排序都放在了 Lucene.Net 中,而且 SQL Server 对它的参数很挑剔,我们怎么能吃到蛋糕呢?

我正在考虑首先进行 sql 查询计算,将元素减少到它们的 doc id,然后为 Lucene 提供一个包含所有可能 id 的巨大 OR 查询,让它正确选择可能的内容,但我担心查询大小

伪代码

listIds = Nhibernate.Criteria.ReduceToIds.List(of MyObject)
queryIds = String.join(" ID:", l)
return NHibernate.Search(queryIds)

显然,可以通过只允许某些文档 ID 作为查询的一部分来使 Lucene 过滤器工作,所以应该是可能的,但我真的没有在 Nhibernate.search 中看到这样做的方法

你知道我应该如何处理这个问题吗?是否可以通过向 SQL 询问 id 列表来过滤查询?是不是矫枉过正?还有其他解决方案吗?

【问题讨论】:

    标签: nhibernate lucene.net nhibernate.search


    【解决方案1】:

    通常当 Lucene.Net 返回超过 2100 个结果时你会遇到问题,因为 NHibernate.Search 将构建一个大的 SELECT * FROM T WHERE ID IN (@p0,@p1 ...)

    所以,如果您的 lucene 查询返回的结果不超过 2100 个,应该没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      相关资源
      最近更新 更多