Сфинкс запрос конвертировать из MySQL

0

У меня есть этот рабочий SQL-запрос с логическим режимом поиска и двумя объединениями, и его нужно переписать для работы с моим индексом в sphinx для лучшей производительности.

sql-запрос в конфигурации sphinx:

 sql_query     = \
      SELECT id, title, description \
      FROM post

Sql запрос для поиска:

 Select distinct p.id, 
     MATCH (title, description) AGAINST ('polopet*' IN BOOLEAN MODE ) AS score , 
     SQRT( POW(69.1 * (l.Latitude - 48.711982), 2) + POW(69.1 * (2.677415 - l.Longitude) * COS(l.Latitude / 57.3), 2)) AS distance 
 FROM post p 
     join location l on (l.id = p.location_id and acos(sin(l.Latitude * 0.0175) * sin(48.711982 * 0.0175) + cos(l.Latitude * 0.0175) * cos(48.711982 * 0.0175) * cos((2.677415 * 0.0175) - (l.Longitude * 0.0175))) * 3959 <= 31.5) 
     right join post_category as pc on ( p.id = (
         select distinct post_id 
             from post_category as pc 
             where pc.post_category in ("BUSINESS_SERVICES") and post_id=p.id
     )) 
 ORDER BY score Desc 
 LIMIT 30 OFFSET 0 ;

Может кто-нибудь мне помочь?

  • 0
    Можете ли вы показать свои схемы таблиц и ваши данные хотя бы частично?
  • 0
    Я могу показать вам объект json: {"title": "Львовский полопет", "description": "my town my second", "category": ["BUSINESS_SERVICES", "EDUCATIONAL"], "web_site": "web site "," charge_type ":" HOURLY "," working_plan ": [{" working_day ":" SUNDAY "," from_hour ":" 9 pm "," to_hour ":" 10 pm "}, {" working_day ":" WEDNESDAY "," from_hour ":" 8 pm "," to_hour ":" 9 pm "}]," location ": {" latitude ":" 48.732938 "," longitude ":" 2.458872 "}} сообщение и местоположение имеют отношение один один, post и post_category один ко многим
Показать ещё 2 комментария
Теги:
sphinx

1 ответ

0
Лучший ответ

Это может быть не полное решение для вашей задачи, но должно быть хорошим началом:

Config:

[snikolaev@dev01 ~]$ cat sphinx_49576229.conf
source min
{
    type = mysql
    sql_host = localhost
    sql_user = root
    sql_pass =
    sql_db = test
    sql_query = select  p.id,  p.title, p.description, l.Latitude, l.Longitude FROM post p join location l on l.id = p.location_id
    sql_attr_multi = uint post_category_id from query; SELECT post_id, id from post_category
    sql_attr_float = Latitude
    sql_attr_float = Longitude
}

index idx_min
{
    path = idx_min
    source = min
    min_prefix_len = 3
}

searchd
{
    listen                       = 9314:mysql41
        log = sphinx_min.log
        pid_file = sphinx_min.pid
    binlog_path = binlog
}

Индексация:

[snikolaev@dev01 ~]$ indexer -c sphinx_49576229.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_49576229.conf'...
indexing index 'idx_min'...
collected 1 docs, 0.0 MB
collected 2 attr values
sorted 0.0 Mvalues, 100.0% done
sorted 0.0 Mhits, 100.0% done
total 1 docs, 16 bytes
total 0.005 sec, 3152 bytes/sec, 197.00 docs/sec
total 6 reads, 0.000 sec, 10.6 kb/call avg, 0.0 msec/call avg
total 14 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
rotating indices: successfully sent SIGHUP to searchd (pid=21241).

Поиск:

[snikolaev@dev01 ~]$ mysql -P9314 -h0
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 2.6.3 5bc9e81@180316 dev

Copyright (c) 2009-2017 Percona LLC and/or its affiliates
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select *, geodist(48.712002, 2.677411, latitude, longitude) dist from idx_min where match('desc*') and dist < 20 and ANY(post_category_id) in (1);
+------+-----------+-----------+------------------+-----------+
| id   | latitude  | longitude | post_category_id | dist      |
+------+-----------+-----------+------------------+-----------+
|    1 | 48.712002 |  2.677410 | 1,2              | 11.099242 |
+------+-----------+-----------+------------------+-----------+
1 row in set (0.00 sec)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню