Проблема парсинга запросов Zend_Search_Lucene

Вот настройка, у меня есть индекс Lucene, и он хорошо работает с 2000 документами, которые я проиндексировал. Я использую Люк (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));  

Это упрощенная версия фактического кода, но именно это он и генерирует.

Вот что я заметил после некоторой отладки, метод "optimize" просто уничтожает сам запрос. Я создал следующий код:

$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 анализирует запрос для выполнения поиска.

Любая помощь приветствуется.


person Jesta    schedule 05.10.2009    source источник


Ответы (1)


Я буду откровенен, Zend_Search_Lucene (ZSL) содержит ошибки и уже давно не поддерживается.

Это также концептуально неверно. Позвольте мне объяснить, почему: поисковые системы должны быстро отвечать на поисковые запросы, проблема с ZSL в том, что он реализован на чистом PHP. Это означает, что при каждом запросе все файлы индексов постоянно читаются и перезагружаются снова. Быстро не может быть.

В самом Lucene нет ничего плохого, есть даже очень хорошая альтернатива под названием Solr, основанная на Lucene: это поисковый сервер, реализованный на Java, который может индексировать и отвечать на все ваши запросы Lucene. Из-за серверной природы Solr вы не страдаете от низкой производительности, перезагружая все файлы Lucene снова и снова.

Это несколько отличается от того, о чем вы спрашивали, я ждал два года, пока мои ошибки ZSL будут исправлены, теперь это случай с использованием Solr :)

person Patrick Allaert    schedule 03.11.2009
comment
после того, как в последнее время много дрался с zend lucene, получил +1 к этому! - person benlumley; 04.11.2009