SQL найти близкие совпадения - PullRequest
2 голосов
/ 31 мая 2011

Я пытаюсь построить систему фильтрации для продуктов.Продукты имеют много атрибутов, включая цену, размер (см) и количество сторон.Я хочу построить SQL-запрос, который всегда возвращает ALL продуктов, но упорядочивает их по тому, насколько близко они соответствуют критериям поиска.

Например, допустим, у меня есть следующие продукты:

Продукт A Цена: 250 Размер: 50 Сторон: 4

Продукт B Цена: 300 Размер: 60 Стороны: 3

Продукт C Цена: 200 Размер: 60 Стороны: 5

И имеют критерии поиска:

Цена: $ 210 - $ 260

Я хочу вернуть: продукт A, продукт C, продукт B

A - первый, потому что он соответствует всем критериям поиска.C опережает B, потому что 200 долларов ближе всего к диапазону 210-260 долларов, чем 300 долларов.

Это довольно простой случай, но поиск может включать любой атрибут (ы).

Алгоритм, который я имеюв моей голове делается своего рода расчет стандартного отклонения для каждого атрибута, который даст вам «оценку» того, насколько этот атрибут соответствует критериям поиска, эти оценки можно суммировать по продукту, чтобы получить общую оценку того, насколько релевантнопродукт есть.Это по правильному пути?

Я понимаю, что это довольно сложный вопрос, на самом деле я просто ищу какое-то руководство больше, чем что-либо другое.

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

В основном вам нужно придумать функцию «расстояние» для каждой строки, которая возвращает 0, если все критерии совпадают, или какое-то положительное значение, указывающее, насколько близко в противном случае. Каждый из разных столбцов должен иметь некоторый вес, поскольку отклонение на 1 доллар не так далеко, как отклонение на 1 количество сторон. Для цены, если она ниже 210, невзвешенное расстояние будет (210 - цена), если цена превышает 260, невзвешенное расстояние для столбца цены будет (цена - 260). Затем вы можете сложить взвешенные расстояния w1 * цена_дистанция + w2 * размер_дистанция + s3 * сторон_дистанция. Тогда вы можете сделать заказ на расстоянии.

3 голосов
/ 31 мая 2011

Как насчет вычисления среднего, а затем упорядочения по отклонению от этого среднего?Я представляю себе что-то вроде этого (очевидно, имена вашей таблицы / столбца будут другими):

SELECT
  p.price,
  p.size,
  p.sides,
  ABS(p.price - 235) AS distance
FROM
  products p
ORDER BY
  distance;

Конечно, вы также можете добавить функцию IF, чтобы оценить, является ли ценав диапазоне, и я бы предложил использовать параметризованные запросы на обратной стороне вместо подачи среднего непосредственно в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...