Zend_Search_Lucene查询解析问题 - php

这是设置,我有一个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查询解析:

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

现在,如果我使用此查询字符串,并将其拍打成LUKE,然后单击“搜索”,它返回的结果就很好。当我使用Query Find方法时,它会爆炸。因此,我对其功能进行了一些研究,发现了一个问题(我相信)

首先,这里是执行搜索的实际代码行:

$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: 
======

注意第三个输出如何完全为空。看来查询的重写和优化导致查询字符串本身只是空的。

有谁知道为什么优化方法似乎只是一起删除我的查询?我是否缺少可能需要解析的过滤器或某种接口?当我将它们粘贴到LUKE并手动对索引运行它们时,所有查询都可以正常工作,但是Zend解析查询以进行搜索的方式有些愚蠢。

任何帮助表示赞赏。

参考方案

我会很坦率地说,Zend_Search_Lucene(ZSL)有问题,并且已经很长时间没有维护了。

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

Lucene本身没有任何问题,甚至还有一个非常好的名为Solr的替代方案,它基于Lucene:它是用Java实现的搜索服务器,可以索引和回复所有Lucene查询。由于Solr的服务器性质,通过一次又一次地重新加载所有Lucene文件,您不会遭受性能下降的困扰。

这与您要求的有所不同,我等了两年才解决了我的ZSL错误,现在使用Solr就是这样:)

PHP Zend Controller插件被调用两次 - php

我注意到我的插件被调用了两次。我知道这个事实是因为在我的ViewSetup插件中它注册了标题,并且标题两次包含相同的内容。有任何想法吗? 参考方案 您最有可能将呼叫复制到preDispatch或postDispatch。对于尚未调度的每个请求,在Zend_Controller_Front::dispatch的循环内调用这些方法。这意味着将分派设置为false…

zend_navigation和模块 - php

目前,我正在使用zend开发应用程序,并将该应用程序分为模块。默认模块是未登录用户访问并可以自由浏览的主站点。登录时,根据用户类型,您将转到由简单ACL控制的模块A或模块B。如果您可以访问模块A,则不能访问模块B,反之亦然。两种用户类型都可以看到默认模块。现在,我想使用Zend_Navigation来管理所有模块中的整个应用程序导航。我不确定该怎么做,因为我…

取消ajax调用后,如何取消PHP进程? - php

我目前正在使用具有巨大数据库的CRM系统。如果用户要搜索客户,则可以使用ajax搜索。每次他在搜索字段中更改某项内容时,在呼叫等待期间,旧呼叫都会被取消,而新呼叫将被发送到服务器。我的问题是,服务器端的php进程继续运行。因此,如果用户开始输入地址,则会启动和取消多个请求,并且服务器需要越来越多的时间来回答。取消ajax调用后,是否可以取消正在运行的php进…

Zend Framework应用程序中的“会话已经开始……”异常 - php

尝试加载Zend Framework应用程序时出现此错误: 致命错误:未捕获的异常 带有消息的“ Zend_Session_Exception” “会议已经由 session.auto-start或session_start()' 在 /www/htdocs/w00a1ed7/autospin/redaktion/library/Zend/Session.p…

在ZEND中处理JSONP调用 - php

通过搜索(或Google)找不到答案,所以我自己问。是否可以处理对zend框架的JSONP调用?仅找到此页面:http://framework.zend.com/wiki/display/ZFPROP/Zend_Json_Server+-+Lode+Blomme但我不确定它是否已经实施!谢谢 参考方案 JSONP只是包装在客户端上执行的指定回调函数中的JSO…