Jes*_*sta 2 php lucene search zend-framework 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
Run Code Online (Sandbox Code Playgroud)
基本上我有一个可以通过上述字段搜索的表单,让你混合和匹配任何上述信息,并将其解析为zend luceue查询.这不是问题,问题是当我开始组合术语时,在查找中触发的"优化"方法会导致查询消失.
这是我正在运行的示例搜索:
表格版本:
Title: test title
Publication: publication name
Run Code Online (Sandbox Code Playgroud)
Lucene查询解析:
+(title:test title) +(publication:publication name)
Run Code Online (Sandbox Code Playgroud)
现在,如果我接受此查询字符串,并将其打入LUKE,然后点击"搜索",则返回结果就好了.当我使用查询查找方法时,它会爆炸.所以我做了一些关于它如何运作并发现问题的研究(我相信)
首先,下面是执行搜索的实际代码行:
$searchQuery = "+(title:test title) +(publication:publication name)";
$hits = new ArrayObject($this->index->find($searchQuery));
Run Code Online (Sandbox Code Playgroud)
它是实际代码的简化版本,但这就是它生成的内容.
现在继续调试后我注意到的是,"优化"方法只会破坏查询本身.我创建了以下代码:
$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/>";
Run Code Online (Sandbox Code Playgroud)
其中输出以下文字:
======
Original: +(title:test title) +(publication:publication name)
Rewrite: +(title:test title) +(publication:publication name)
Optimized + Rewrite:
======
Run Code Online (Sandbox Code Playgroud)
注意第3个输出是如何完全为空的.看来,查询上的重写和优化导致查询字符串只是自己清空.
有没有人知道为什么优化方法似乎只是一起删除我的查询?我错过了一个过滤器或某种可能需要解析的界面吗?当我将它们粘贴到LUKE并手动对索引运行时,所有查询都能正常工作,但是Zend正在解析查询以进行搜索的方式正在发生一些愚蠢的事情.
任何帮助表示赞赏.
我会坦率地说,Zend_Search_Lucene(ZSL)很快就出现了问题,而且很久以来一直没有维护.
这在概念上也是错误的.让我解释一下原因:搜索引擎可以快速回复搜索查询,ZSL的问题在于它是用纯PHP实现的.这意味着,在每一个查询,所有索引文件的读取和重新加载一次,连续.它不可能很快.
Lucene本身没有任何问题,甚至有一个非常好的替代方案,名为Solr,它基于Lucene:它是一个用Java实现的搜索服务器,它可以索引并回复你所有的Lucene查询.由于Solr的服务器性质,通过一次又一次地重新加载所有Lucene文件,您不会遇到性能不佳的问题.
这与你问的有些不同,我等了两年才能解决我的ZSL错误,现在是使用Solr的情况:)