В Zend Lucene, как я могу изменить поле, которое ищет запрос?

Я пытаюсь создать «расширенный поиск», где я могу позволить пользователю искать только определенные поля моего индекса. Для этого я использую логический запрос:

$sq1 = Zend_Search_Lucene_Search_QueryParser::parse($field1); // <- provided by user
$sq2 = Zend_Search_Lucene_Search_QueryParser::parse($field2); // <- provided by user

$query = new Zend_Search_Lucene_Search_Query_Boolean();
$query->addSubquery($sq1, true);
$query->addSubquery($sq2, true);

$index->find($query);

Как я могу указать, что sq1 будет искать поле «foo», а sq2 будет искать поле «bar»?

Я чувствую, что должен по-разному анализировать запросы для эффекта (потому что пользователь может ввести имя поля), но в документах упоминается только QueryParser для объединения запросов, введенных пользователем, с запросами API.


person Alex J    schedule 12.01.2010    source источник


Ответы (2)


Кажется, самый простой способ сделать это — просто подделать пользовательский ввод:

$sq1 = Zend_Search_Lucene_Search_QueryParser::parse("foo:($field1)");
$sq2 = Zend_Search_Lucene_Search_QueryParser::parse("bar:($field2)");

В $field1 и $field2 следует заранее убрать круглые скобки и двоеточия, чтобы избежать «внедрения поиска».

person Alex J    schedule 14.01.2010

Вам нужен API построения запросов: http://www.zendframework.com/manual/en/zend.search.lucene.query-api.html#zend.search.lucene.queries.multiterm-query

Однако я бы порекомендовал вам вообще отказаться от Zend_Search_Lucene. Реализация Java прекрасна, но реализация PHP очень плоха. Что касается того, что вы пытаетесь сделать, это ведет себя очень глючно, см. вопрос 1508748. Это также очень, очень медленно.

person Matthijs Bierman    schedule 14.01.2010
comment
Проблема в том, что API не объясняет, как это сделать. Как получить пользовательский ввод и превратить его в многотерминальный запрос без токенизации вручную? Я понимаю, что поисковая система PHP — не лучшая идея, но я ищу простоту реализации прямо сейчас, и я буду мигрировать, если это станет проблемой позже. - person Alex J; 14.01.2010
comment
В этом случае у вас, похоже, нет другого выбора, кроме как использовать решение, предоставленное Ильей Жеребцовым. Опять же, имейте в виду, что реализация PHP очень медленная. У вас все еще есть выбор, чтобы использовать другую поисковую систему. Я настоятельно рекомендую вам сделать это. - person Matthijs Bierman; 16.01.2010