将查询部分与Lucene和部分数据库(MySQL)相结合

时间:2012-09-28 17:43:43

标签: c# mysql database nhibernate lucene.net

我有一个应用程序需要进行过滤并从文章列表中检索结果。对于数据库,我使用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中进行这样的查询需要花费很长时间,而全文搜索的速度非常快。

任何想法如何处理这样的问题?

1 个答案:

答案 0 :(得分:0)

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

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

查看Lucene syntax documentation中的“范围搜索”部分。