这是设置,我有一个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正在解析查询以进行搜索的方式正在发生一些愚蠢的事情。
感谢任何帮助。
答案 0 :(得分:6)
我会坦率地说,Zend_Search_Lucene(ZSL)很快就出现了问题而且很久以来都没有维护过。
这在概念上也是错误的。让我解释一下原因: 搜索引擎可以快速回复搜索查询,ZSL的问题在于它是用纯PHP实现的。这意味着在每次查询时,所有索引文件都会被连续读取并重新加载 。它不可能很快。
Lucene本身没有任何问题,甚至还有一个名为Solr的非常好的替代品,它基于Lucene:它是一个用Java实现的搜索服务器,它可以索引并回复你所有的Lucene查询。由于Solr的服务器性质,您不会通过反复重新加载所有Lucene文件来降低性能。
这与你提出的问题有些不同,我等待了两年才能解决我的ZSL错误,现在是使用Solr的情况:)