Zend_Search_Lucene查询解析问题

时间:2009-10-05 16:46:25

标签: php zend-framework search lucene zend-search-lucene

这是设置,我有一个Lucene索引,它适用于我索引的2,000个文档。我一直在使用Luke(Lucene Index Toolbox,v.0.9.2)来调试查询,并使用的是ZF 1.9。

我的Lucene索引的布局如下:

I = Indexed
T = Tokenized
S = Stored

Fields:
author - ITS
category - ITS
publication - ITS
publicationdate - IS
summary - ITS
title - ITS

基本上我有一个可以通过上述字段搜索的表单,让您混合和匹配上述任何信息,并将其解析为zend luceue查询。这不是问题,问题是当我开始组合术语时,在查找中触发的“优化”方法会导致查询消失。

以下是我正在运行的示例搜索:

表单版本

Title: test title
Publication: publication name

Lucene Query Parse

+(title:test title) +(publication:publication name)

现在,如果我接受此查询字符串,并将其打入LUKE,然后点击“搜索”,则返回结果就好了。当我使用查询查找方法时,它会爆炸。所以我做了一些关于它如何运作并发现问题的研究(我相信)

首先,下面是执行搜索的实际代码行:

$searchQuery = "+(title:test title) +(publication:publication name)";
$hits = new ArrayObject($this->index->find($searchQuery));  

它是实际代码的简化版本,但这就是它生成的内容。

现在讲述了我在调试后注意到的内容,“优化”方法只会破坏查询本身。我创建了以下代码:

$rewrite = $searchQuery->rewrite($this->index);
$optimize = $searchQuery->rewrite($this->index)->optimize($this->index); 
echo "======<br/>";
echo "Original: ".$searchQuery."<br/>";
echo "Rewrite: ".$rewrite."<br/>";
echo "Optimized + Rewrite: ".$optimize."<br/>";
echo "======<br/>";  

其中输出以下文字:

======
Original: +(title:test title) +(publication:publication name)
Rewrite: +(title:test title) +(publication:publication name)
Optimized + Rewrite: 
======

注意第3个输出是如何完全为空的。看来重写&amp;对查询进行优化会导致查询字符串自行清空。

有没有人知道为什么优化方法似乎只是一起删除我的查询?我错过了一个过滤器或某种可能需要解析的界面吗?当我将它们粘贴到LUKE并手动对索引运行时,所有查询都能正常工作,但是Zend正在解析查询以进行搜索的方式正在发生一些愚蠢的事情。

感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

我会坦率地说,Zend_Search_Lucene(ZSL)很快就出现了问题而且很久以来都没有维护过。

这在概念上也是错误的。让我解释一下原因: 搜索引擎可以快速回复搜索查询,ZSL的问题在于它是用纯PHP实现的。这意味着在每次查询时,所有索引文件都会被连续读取并重新加载 。它不可能很快。

Lucene本身没有任何问题,甚至还有一个名为Solr的非常好的替代品,它基于Lucene:它是一个用Java实现的搜索服务器,它可以索引并回复你所有的Lucene查询。由于Solr的服务器性质,您不会通过反复重新加载所有Lucene文件来降低性能。

这与你提出的问题有些不同,我等待了两年才能解决我的ZSL错误,现在是使用Solr的情况:)