Как сфинкс рассчитал вес? - PullRequest
       8

Как сфинкс рассчитал вес?

3 голосов
/ 13 сентября 2010

Примечание:
Это кросс-пост, он сначала публикуется на форуме sphinx , однако я не получил ответа, поэтому выкладываю его здесь.

Сначала взгляните на пример:

Ниже приведена моя таблица (только для тестирования):

+----+--------------------------+----------------------+
| Id | title                    | body                 |
+----+--------------------------+----------------------+
|  1 | National first hospital  | NASA                 |
|  2 | National second hospital | Space Administration |
|  3 | National govenment       | Support the hospital |
+----+--------------------------+----------------------+

Я хочу найти содержимое по названию и телуполе, поэтому я настраиваю sphinx.conf, как показано ниже:

--------The sphinx config file----------
source mysql
{
        type = mysql
        sql_host = localhost
        sql_user = root
        sql_pass =0000
        sql_db = testfull
        sql_port = 3306 # optional, default is 3306
        sql_query_pre = SET NAMES utf8
        sql_query = SELECT * FROM test
}

index mysql
{
        source = mysql
        path = var/data/mysql_old_test
        docinfo = extern
        mlock = 0
        morphology = stem_en, stem_ru, soundex
        min_stemming_len = 1
        min_word_len = 1
        charset_type = utf-8
        html_strip = 0
}

indexer
{
        mem_limit = 128M
}

searchd
{
    listen = 9312
        read_timeout = 5
        max_children = 30
        max_matches = 1000
        seamless_rotate = 0
        preopen_indexes = 0
        unlink_old = 1
        pid_file = var/log/searchd_mysql.pid
        log = var/log/searchd_mysql.log
        query_log = var/log/query_mysql.log
}
------------------

Затем я переиндексирую базу данных и запускаю демон searchd.

На стороне клиента я установил атрибут как:

---------- Конфигурация на стороне клиента -------------------

sc = new SphinxClient();
///other thing
HashMap<String, Integer> weiMap=new HashMap<String, Integer>();
weiMap.put("title", 100);
weiMap.put("body", 0);
sc.SetFieldWeights(weiMap);

sc.SetMatchMode(SphinxClient.SPH_MATCH_ALL);

sc.SetSortMode(SphinxClient.SPH_SORT_EXTENDED,"@weight DESC");

КогдаЯ пытаюсь найти «Национальная больница», я получил следующий вывод:

Query 'National hospital' retrieved 3 of 3 matches in 0.0 sec.
Query stats:
        'nation' found 3 times in 3 documents
        'hospit' found 3 times in 3 documents

Matches:
1. id=3, weight=101
2. id=1, weight=100
3. id=2, weight=100

Номер совпадения (три совпавших) правильный, но порядок результата не тот, который я хотел.

Очевидно, что документы с номерами 1 и 2 должны быть наиболее закрытыми элементами для требуемой строки («Национальная больница»), поэтому, по моему мнению, им должны быть даны самые большие веса, но они упорядочены в последнюю позициювкл.

Интересно, есть ли что-нибудь, чтобы удовлетворить мое требование?

PS:

1) пожалуйста, не предлагайте мне установить sortModel равным:

sc.SetSortMode(SphinxClient.SPH_SORT_EXTENDED,"@weight ASC");

Это может работать только для этого примера, это вызовет некоторые другие проблемы со здоровьем.

2) На самом деле все содержимое моей таблицы китайское, я просто использую "National Hosp..l", чтобы сделатьпример.

1 Ответ

0 голосов
/ 02 мая 2013

1 ° Вы спрашиваете «Национальная больница», но сфинкс ищет «нацию» и «гостеприимство», потому что

 morphology = stem_en, stem_ru, soundex

2 ° Вы даете вес

 weiMap.put("title", 100);
 weiMap.put("body", 0);

к несуществующим текстовым полям

 sql_query = SELECT * FROM test

3 ° наконец мой простой ответ на главный вопрос

Вы сортируете по весу, третий ряд имеет больший вес, потому что нет слов между нацией и гостеприимством

...