В Zend Lucene как я могу изменить поле, которое ищет запрос? - PullRequest
2 голосов
/ 12 января 2010

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

$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.

Ответы [ 2 ]

1 голос
/ 14 января 2010

Кажется, самый простой способ сделать это - просто обмануть ввод пользователя:

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

$ field1 и $ field2 должны быть заранее очищены от круглых скобок и двоеточий, чтобы избежать "поискового внедрения".

0 голосов
/ 14 января 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. Он также очень, очень медленный.

...