Примечание:
Это кросс-пост, он сначала публикуется на форуме 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", чтобы сделатьпример.