4

我有一个应用程序需要从文章列表中进行过滤和检索结果。对于数据库,我使用 MySQL,NHibernate 作为 ORM。该查询还基于关键字进行全文搜索,为此它使用 Lucene.Net。

我的问题是查询跨越“两个”域。例如,我可能需要获取所有包含关键字“交通管制”的文章,并且 PublishedOn < 2012-10-01。此外,查询使用分页,例如页面 #2,页面大小为 50。问题是我如何创建一个跨越 MySQL(对于 PublishedOn 部分)和 Lucene.Net 的查询来利用全文搜索能力。

如果我先在 MySQL 上进行搜索,我不能只得到前 50 个,因为结果可能会在 Lucene 中进一步过滤,我需要 50 作为我的页面大小。如果我从 Lucene.Net 开始,情况也是如此。此外,最好按照“相关性”进行排序,所以这是 Lucene 可以做的事情,而不是 MySQL。

我目前的方法是首先通过 MySQL 过滤,并检索匹配记录的所有主键。然后,我在 Lucene 中进行查询,使用术语查询将主键与结果列表相匹配。但是,Lucene 对于这样的查询非常慢,并且数据库可以包含超过 200,000 篇文章。在 Lucene 中进行这样的查询需要很长时间,而对于全文搜索来说却非常快。

有什么想法可以解决这样的问题吗?

4

1 回答 1

0

Lucene 不仅仅是关于全文搜索。您可以将 PublishedOn 属性添加到 Lucene 文档并执行如下查询:

Text:"traffic control" AND PublishedOn:[00000000 TO 20121001]

查看Lucene 语法文档中的“范围搜索”部分。

于 2012-09-30T08:05:01.543 回答