В настоящее время я установил Zend_Search_Lucene в качестве поисковой системы в проекте, над которым я работаю.
Он отлично работает на уровне по умолчанию (т.е. поиск по всем полям), однако теперь мне нужно выполнить поиск в определенном поле.
Причина этого в том, что я пытаюсь закодировать возможность работы с орфографическими ошибками. Поэтому я добавляю звуковое выражение каждого слова в заголовке документа.
Например:
$productArray['title'] = 'June Monthly Meat Box';
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::text('product_title', $productArray['title']));
$soundex = implode(' ', array_map('soundex', array_map('trim', preg_split('/ /', $productArray['title'], NULL, PREG_SPLIT_NO_EMPTY))));
$doc->addField(Zend_Search_Lucene_Field::keyword('soundex', $soundex));
$index->addDocument($doc);
Это добавляет «J500 M534 M300 B200» в качестве поля soundex.
Вот как выполняется поиск:
$queryString = trim(urldecode($this->_request->getParam('q')));
$words = array_map('trim', preg_split('/ /', $queryString, NULL, PREG_SPLIT_NO_EMPTY));
$query = new Zend_Search_Lucene_Search_Query_Boolean();
$subquery1 = new Zend_Search_Lucene_Search_Query_MultiTerm();
foreach($words as $word)
{
$subquery1->addTerm(new Zend_Search_Lucene_Index_Term($word));
}
$subquery2 = new Zend_Search_Lucene_Search_Query_MultiTerm();
foreach($words as $word)
{
$subquery2->addTerm(new Zend_Search_Lucene_Index_Term(strtolower(soundex($word)), 'soundex'));
}
$query->addSubquery($subquery1);
$query->addSubquery($subquery2);
Переменная $subquery1
хранит каждое слово исходного запроса (это работает само по себе)
Переменная $subquery2
хранит звуковое выражение каждого слова. План состоит в том, чтобы искать поле для звукового выражения, а также другие поля для каждого слова. Поэтому, если кто-то ошибся в написании «мясо» с «maet», он вернет результат, поскольку звуковое выражение будет таким же для «M300».
Я использую Luke для просмотра набора данных и вижу правильные термины. Когда я использую Luke для поиска soundex (т.е. soundex:M300
), он не возвращает результатов, однако, если я ищу все поле (т.е. soundex:"J500 M534 M300 B200"
), он возвращает правильный документ.
Что происходит, чтобы предотвратить поиск в поле?