Elastic Search Индивидуальная оценка для мобильных продуктов

Я использую эластичный поиск 2.3. Я сохранил все атрибуты мобильных продуктов в ES после удаления всех стоп-слов (например, with, extra и т. д.)

Пример схемы для «Micromax Canvas Doodle 4 white с 8 ГБ оперативной памяти и 8 ГБ встроенной памяти»:

"_source": {
   "internal_mem": "8 GB",
   "color": "White",
   "brand": "Micromax",
   "ram": "8 GB",
   "model": "Canvas Doodle 4"
}

ES имеет тысячи мобильных имен с этими функциями. Теперь мне нужно выполнить поиск по этим продуктам. Для поиска у меня есть все продукты, разбитые по атрибутам. Итак, поиск «canvas doodle 4 gb» будет:

{
    "query": {
        "bool": {
            "should": [{
                "match": {
                    "model": {
                        "query": "canvas^4 doodle",
                        "boost": 2
                    }
                }
            }, {
                "match": {
                    "internal_mem": {
                        "query": "4 GB",
                        "boost": 0.2
                    }
                }
            }]
        }
    }
}

Мне нужен результат:

  1. Все продукты "холст дудл 4g" ​​или "холст дудл" в первую очередь (отсортированы по количеству баллов)
  2. Затем продукты, имеющие «холст»
  3. потом "4g"

Правила, которые я установил:

  1. Модель, Бренд должны иметь более высокий приоритет по сравнению с тремя другими
  2. Первое слово в модели/бренде должно иметь большее значение. например Iphone, холст и т. д.

Проблемы:

  1. Должен ли я использовать этот запрос или мне следует перейти к запросу function_score (мне также нужна пользовательская оценка)?

  2. Как избежать результатов поиска для «4» в модели? например "4", "mini", "3g", "4g" Нужно ли отключать IDF, чтобы избежать таких результатов?

  3. Отдать приоритет первому слову о модели/бренде? (при условии, что они более важны, например, «холст» в холсте doodle 3)

  4. Рекомендуемые значения «повышения» для разных атрибутов?

Открыт для любых предложений/улучшений. Пожалуйста, предложите.


person randomuser    schedule 03.07.2016    source источник


Ответы (1)


Пожалуйста, попробуйте следующий запрос.

{
  "query": {
    "filtered": {
        "query": {
            "bool": {
                "should": [{
                    "multi_match": {
                        "query": "canvas doodle 4",
                        "fields": ["model"],
                        "operator": "and"
                    }
                }, {
                    "multi_match": {
                        "query": "canvas doodle 4",
                        "fields": ["model"],
                        "type": "phrase_prefix"
                    }
                }, {
                    "multi_match": {
                        "query": "canvas doodle 4",
                        "fields": ["model"],
                        "type": "phrase"
                    }
                }]
            }
        }
    }
}

Это будет работать так, как если бы он проверял canvas, doodle и 4 , затем префикс фразы, а затем запросы фразы.

person Lijo Abraham    schedule 04.07.2016
comment
Почему мы используем отфильтрованный запрос без фильтра? - person randomuser; 06.07.2016