Сфинкс ищет точное совпадение, а затем находит совпадения - PullRequest
3 голосов
/ 25 августа 2011

Я использую Sphinx для поиска на веб-сайте, и я столкнулся с небольшим затруднением при возвращении соответствующих результатов.

Чтобы не усложнять мой вопрос, давайте предположим, что у меня есть два поля, @title и @body, которые имеют веса 100 и 15 соответственно. Когда я ищу маленькие слова, такие как слово ' in ', я хотел бы, чтобы он ранжировал точные совпадения для этого поискового запроса выше, а затем проверял совпадения на ' in * | * в | * в * 'и ранжировать их немного ниже. Есть ли способ придать этому типу специфичности ваши поиски?

Пример результатов для ' in ':

  1. Индийская еда
  2. В Середина
  3. Документ о латыни

Некоторые соответствующие настройки:

In sphinx.conf :

morphology              = stem_en
charset_type            = utf-8
min_word_len            = 2
min_prefix_len          = 0
min_infix_len           = 2
enable_star             = 1

In search.php

$sp->SetMatchMode( SPH_MATCH_EXTENDED2 );
$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetFieldWeights ( array('title' => 100, 'body' => 15) );

Кроме того, как примечание: у меня также были случаи, когда частичные совпадения даже не отображаются в результатах поиска. Например, я искал Корова , но Ковбой не появляется в результате. Я также искал Cowb и Cowbo , и только когда я набрал Cowboy , я получил ожидаемый результат. Есть мысли?


Этот вопрос аналогичен этому предыдущему SO-вопросу , но я надеюсь, что немного подробнее рассказал о моей проблеме и о том, что я пытался найти решение.

Ответы [ 2 ]

3 голосов
/ 27 августа 2011

Морфологически выглядит как Корова, не связанная с Ковбоем.

Вы можете решить это двумя способами:

  1. Используйте файл wordforms с Cow> Cowboy
  2. Когда включена звезда, вы можете изменить запрос с «Корова» на «Корова *», в котором будут найдены все слова, начинающиеся с «Корова».

Что касается различного ранжирования для "in" и " in ", я мог бы предложить иметь два поля body в индексе, скажем: body и body_star с одинаковым содержимым из поля body.

в search.php

$sp->SetRankingMode( SPH_RANK_PROXIMITY_BM25 );
$sp->SetMatchingMode( SPH_MATCH_EXTENDED2 );
$sp->SetFieldWeights ( array('title' => 20, 'body' => 15, 'body_start' => 5) );
$sp->Query("@body in @body_star *in* @title in");

Это должно сработать.

2 голосов
/ 31 августа 2011

Также вы можете установить опцию expand_keywords в вашей конфигурации http://sphinxsearch.com/docs/1.10/conf-expand-keywords.html и установите режим ранжирования на SPH_RANK_SPH04 http://sphinxsearch.com/blog/2010/08/17/how-sphinx-relevance-ranking-works/

...