2017-01-02 16 views
0

У меня есть MySQL DataTable личных параметров (около 100 на человека):поиск MySQL DB с частичной точной математике

{"id":"1", "height":"182", "hair_color":"red", "eyes_color":"haze", "day_of_birth":"25"} 

(формат JSON является только для простоты)

я должен быть в состоянии осуществить частичный поиска, чтобы получить, скажем, 5-1 параметров, чтобы получить результат.

QUERY: ["height":182, "hair_color":"red", "day_of_birth":"25", "skin_color":"black"]

В конце концов мне нужен список соответствующих строк с числом соответствующих параметров

LIKE: ["id":"1","matched":"2"]

и получить, скажем, "первые 100" с самым большим количеством матчей (конечно, ASAP :))

ответ

1

Если вам нужно придерживаться базы данных sql, попробуйте что-нибудь вроде:

select id, if (height=182,1,0) 
     + if(hair_color='red',1,0) 
     + if(day_of_birth=25,1,0) 
     + if(skin_color='black',1,0) as matched 
from person 
order by matched desc 
limit 100 

Для сопоставления множества записей с большим количеством параметров, однако, могут быть лучшие варианты, например. используя полный текстовый индекс, например, Apache Lucene/SOLR.

+0

Хм ... никогда не пробовал такое отношение. Интересно. 100 if's over ~ 1000000 rows db ... может потребовать много времени ... но я попробую! –

+1

см. Комментарий относительно Lucence ... –

+1

Вы должны обязательно искать какой-либо другой механизм хранения. Если сохранение MySQL является обязательным, взгляните на Lucene (или Elastic Search). Если наличие реляционной базы данных является обязательным, но вы, вероятно, должны рассмотреть альтернативы MySQL, то у вас может быть успех с PostgreSQL, который предлагает поддержку различных нечетких совпадений и многомерных запросов с индексом. И я не знаю точно, но MariaDB также может иметь некоторые интересные функции в этом отношении. – jwatkins

 Смежные вопросы

  • Нет связанных вопросов^_^