2012-03-22 5 views
0

Мы используем sphinx в базе данных среднего размера (10-миллиметровые записи, 2 гб) с использованием стандартного подхода EXTENDED2/SPH_RANK_PROXIMITY_BM25. Скорость велика, актуальность - это место.Настройка сфинксов для любых/частичных совпадений [через PHP]

Однако мы сталкиваемся с растущими жалобами от конечных пользователей, которые ищут более сложные термины, чем то, что наша база данных имеет и, таким образом, не дает никаких результатов.

К примеру, у нас есть продукт "KitchenAid Artisan 5-Quart Смесители" в то время как общий поиск "KitchenAid Artisan 5-Quart Стенд Миксеры коричневый". Результат с нашими текущими настройками не соответствует, когда мы сможем вернуть элемент, который у нас есть.

Мы попытались использовать сортировку MATCH_ANY по весу, но релевантность полностью исчезает [думаю, куклы и настольные игры появляются], поскольку сфинкс поднимает другие продукты с отдельными словами.

Есть ли способ наилучшей практики построения наших параметров запроса, которые позволят использовать более открытое сопоставление, сохраняя при этом близость и плотность слов?

Вот наши текущие команды PHP API, если это помогает

$cl = new SphinxClient(); 
$cl->SetServer('1.23.4', 456); 
$cl->SetMaxQueryTime(15000); 
$cl->SetMatchMode(SPH_MATCH_EXTENDED2); 
$cl->SetRankingMode(SPH_RANK_PROXIMITY_BM25); 
$cl->SetArrayResult(true); 
$cl->SetFilter('active', array(1)); 
$cl->SetSortMode(SPH_SORT_RELEVANCE, '@weight DESC, priced ASC'); 
$cl->SetLimits(intval($try), 1, 20, 500); 
$cl->SetFieldWeights(array('ptitle' => 60, 'description' => 40)); 
$res = $cl->query($searchterm,"products"); 

ответ

2

Одна вещь, чтобы исследовать это Кворум. Это может быть полезно для длинных запросов, поскольку вам может потребоваться определенное количество ключевых слов. В то время как ANY будет требовать только одно слово, кворум может потребовать сказать 4 из 7.

Это исключит ряд очень плохих совпадений.

И поскольку кворум - это просто синтаксис как часть расширенного режима соответствия - вы можете попробовать все разные режимы ранжирования. Использование SPH_RANK_MATCHANY по-прежнему доступно, чтобы попробовать - так как это должно быть разумно хорошо с «неполными» совпадениями. Но вы также можете попробовать другие режимы.

Если вы используете морфологию, вы также можете включить index_exact_words и дать им повышение в рейтинге.

Так что бы сделать что-то вроде ...

//this works as long as the user is not using special syntax, but if using -="() etc, need to be more clever 
$bits = preg_split('/\s+/',trim($searchterm)); 
$quorum = ceil(count($bits)*0.66); 
$searchterm2 = '='.implode(' =',$bits); 

$searchterm = '"'.$searchterm.'"/'.$quorum.' | "'.$searchterm2.'"/'.$quorum; 

Кроме того, у меня есть сомнения по поводу ваших setLimits. max_matches из 20 кажется очень низким. И обрезание выглядит ненужным; это может даже вызвать проблемы. Он найдет 500 разумных документов, а затем прекратит поиск - даже если в наборе данных есть лучшие совпадения.

+0

Кворум и ваш код выглядят как раз то, что нам нужно, чтобы освободить вещи достаточно. Для тех, кто работает над этим, мы придерживались соответствия EXTENDED2, так как близость действительно помогает. Также было снято обрезание, которое, возможно, помогло вам. –

+0

Примечание: в коде содержится небольшая ошибка. «После первого». $ Кворума. бит должен быть удален для всех, кто сталкивается с проблемами. –

+1

Opps! Отредактирован ответ, чтобы исправить это. – barryhunter

Смежные вопросы