2

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

我的 Lucene Index 的布局如下:

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 解析查询以进行搜索的方式出现了一些愚蠢的问题。

任何帮助表示赞赏。

4

1 回答 1

6

坦率地说,Zend_Search_Lucene (ZSL) 有问题,而且很长时间以来都没有维护过。

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

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

这与您所问的有些不同,我等了两年才解决我的 ZSL 错误,现在使用 Solr 就是这种情况:)

于 2009-11-03T20:48:20.847 回答