⚠️ Эта страница автоматически переведена, и перевод может быть несовершенным.

Построение индекса на 1M документов без единого реального документа

author image
View as markdown

Привет, ребята

Просто хочу поделиться интересным трюком: как легко сгенерировать тестовые данные и проиндексировать их в Sphinx / Manticore Search, не заполняя базу большим объёмом данных и не делая ничего подобного. Ниже — полный конфиг Sphinx / Manticore Search, который строит индекс на 1M документов из случайных трёхсимвольных слов и геокоординат, пример команды для построения индекса и пример запроса SphinxQL с поиском по этому индексу. Нужно лишь любое подключение к любой БД (в этом примере подойдёт mysql -u root).

[snikolaev@dev01 ~]$ cat sphinx_1m.conf
source min
{
  type = mysql
  sql_host = localhost
  sql_user = root
  sql_pass =
  sql_db = test
  sql_query_range = select 1, 1000000
  sql_range_step = 1
  sql_query = select $start, mid(md5(rand()), 1, 3) body, rand() * 180 lat, rand($end) * 90 lng
  sql_attr_float = lat
  sql_attr_float = lng
}

index idx
{
  path = idx_1m
  source = min
}

searchd
{
  binlog_path = #
  listen = 9314:mysql41
  log = sphinx_1m.log
  pid_file = sphinx_1m.pid
}

[snikolaev@dev01 ~]$ indexer -c sphinx_1m.conf --all --rotate
Manticore 2.6.1 9a706b4@180119 dev
Copyright (c) 2001-2016, Andrew Aksyonoff
Copyright (c) 2008-2016, Sphinx Technologies Inc (http://sphinxsearch.com)
Copyright (c) 2017-2018, Manticore Software LTD (http://manticoresearch.com)

using config file 'sphinx_1m.conf'...
indexing index 'idx'...
WARNING: sql_range_step=1: too small; might hurt indexing performance!
collected 1000000 docs, 3.0 MB
sorted 1.0 Mhits, 100.0% done
total 1000000 docs, 3000000 bytes
total 86.580 sec, 34649 bytes/sec, 11549.98 docs/sec
total 5 reads, 0.014 sec, 4512.0 kb/call avg, 2.9 msec/call avg
total 24 writes, 0.031 sec, 1806.1 kb/call avg, 1.3 msec/call avg
rotating indices: successfully sent SIGHUP to searchd (pid=17284).

mysql> select id, geodist(lat,lng,73.9667,40.78, {in=deg,out=km}) dist, lat, lng from idx where dist < 5;
+--------+----------+-----------+-----------+
| id | dist | lat | lng |
+--------+----------+-----------+-----------+
| 636503 | 4.880664 | 73.952385 | 40.929459 |
+--------+----------+-----------+-----------+
1 row in set (0.09 sec)

Как видите, хитрость заключается в использовании директив sql_query_range и sql_range_step, позволяющих Manticore выполнять цикл, пока не наберётся коллекция из 1M документов. Недостаток — более медленное индексирование по сравнению с реальным получением того же объёма данных из БД, но, в конце концов, вы же не собираетесь использовать это в продакшене, верно?

Надеюсь, вы найдёте это полезным, когда решите поиграть с Manticore Search.

Установить Manticore Search

Установите Manticore Search одной командой в Linux или macOS:

curl https://manticoresearch.com | sh

Для расширенных вариантов установки см. полное руководство по установке и документацию .

Установить Manticore Search