Я только что выполнил несколько тестов по своему поисковому индексу, и проблема, похоже, в самом запросе, а не в коде. «И» в запросе является оператором, как и «+». Парсер запросов, похоже, смущен логикой двойного оператора без термина между. Это была блочная цитата, которую я нашел в их документах:
Если используется стиль И / ИЛИ / НЕ, то оператор И или ИЛИ должен присутствовать между всеми терминами запроса. Каждому члену также может предшествовать оператор NOT. Оператор AND имеет более высокий приоритет, чем оператор OR. Это отличается от поведения Java Lucene.
Теперь, выполняя ваш запрос через анализатор, это был объект Search_Query:
string '"lorem ipsum" AND +type:photo' (length=29)
object(Zend_Search_Lucene_Search_Query_MultiTerm)[230]
private '_terms' =>
array
0 =>
object(Zend_Search_Lucene_Index_Term)[236]
public 'field' => null
public 'text' => string 'lorem' (length=5)
1 =>
object(Zend_Search_Lucene_Index_Term)[237]
public 'field' => null
public 'text' => string 'ipsum' (length=5)
2 =>
object(Zend_Search_Lucene_Index_Term)[238]
public 'field' => null
public 'text' => string 'and' (length=3)
3 =>
object(Zend_Search_Lucene_Index_Term)[239]
public 'field' => null
public 'text' => string 'type' (length=4)
4 =>
object(Zend_Search_Lucene_Index_Term)[240]
public 'field' => null
public 'text' => string 'photo' (length=5)
Немного изменив запрос, удалив AND
или удалив +
, и используя только 1.
string '"lorem ipsum" +type:photo' (length=25)
string '"lorem ipsum" AND type:photo' (length=28)
object(Zend_Search_Lucene_Search_Query_Boolean)[227]
private '_subqueries' =>
array
0 =>
object(Zend_Search_Lucene_Search_Query_Phrase)[230]
private '_terms' =>
array
0 =>
object(Zend_Search_Lucene_Index_Term)[233]
public 'field' => null
public 'text' => string 'lorem' (length=5)
1 =>
object(Zend_Search_Lucene_Index_Term)[234]
public 'field' => null
public 'text' => string 'ipsum' (length=5)
1 =>
object(Zend_Search_Lucene_Search_Query_Term)[235]
private '_term' =>
object(Zend_Search_Lucene_Index_Term)[232]
public 'field' => string 'type' (length=4)
public 'text' => string 'photo' (length=5)
Единственная разница: AND
:
private '_signs' =>
array
0 => boolean true
1 => boolean true
+
:
private '_signs' =>
array
0 => null
1 => boolean true
Оператор AND
требует, чтобы в результате требовались оба поисковых запроса, тогда как для +
требуется только значение справа.
Так что просто измените запрос на
"lorem ipsum" AND type:photo
И вы должны получить результаты, которые вы ищете.