У меня есть индекс в ES, где я хранил свой каталог. Документы представляют собой смесь типа строки и массива (пример показан ниже):
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N1234",
"_score" : 1.0,
"_source" : {
"product_id" : "1234",
"name" : "Multifunctional Soapbox Hanging",
"model" : "HS-11",
"image" : "catalog/1.jpg",
"size" : [
"43",
"44",
"45"
],
"color" : [
"66",
"67"
],
"tag" : [
"Soap Dish Rack Bathroom Essentials",
"Plastic Bathroom Essentials",
"Adhesive Bathroom Essentials",
"Smart Accessories Bathroom Essentials",
"Any Bathroom Essentials",
"Brown Bathroom Essentials",
"Bathroom Accessories Bathroom Essentials",
"Bathroom Essentials"
],
"language_id" : "1",
"status" : "7",
"date_added" : "2021-02-06 14:29:37"
}
}
Все документы имеют одинаковую структуру. Я хочу запросить свой индекс для похожих продуктов на основе полей Color
и Tag
. Означает, что если я передам color = 66
и Tag = [ARRAY_OF_VALUES]
, он должен вернуть мне наиболее похожие продукты, отсортированные по количеству баллов, которые могут содержать одинаковый ЦВЕТ или максимальное количество совпадающих ТЕГОВ.
Я пробовал BOOL
запрос с Should
или Must
, но не лучше результатов.
Я понятия не имею, как запрашивать массив, поскольку и цвет, и теги являются массивами. Должен ли я передавать параметры TAGS в виде массива или отдельных значений и делать отдельные запросы match
?
Запрос, который я пробовал (от @ESCoder):
"query": {
"bool": {
"must": [
{
"terms": {
"color": [
"40" //code of blue color
]
}
}
],
"should": [
{
"terms": {
"tag": [
"Casual Dresses",
"Round Neck Dresses",
"Short Sleeves Dresses",
"Blue Dresses"
]
}
}
]
}
}
Ожидаемый результат:
Все товары, содержащие одинаковые color
и максимально похожие tag
, отсортированные по количеству баллов
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N624121",
"_score" : 39.43454,
"_source" : {
"color" : [
"40"
],
"size" : [
"47",
"48",
"50",
"51"
],
"product_id" : "62412",
"name" : "Girls Short Sleeve Fashion Short Dress - Blue",
"model" : "LYQ001",
"tag" : [
"Casual Dresses",
"Body Fitted Dresses",
"Short Gown Dresses",
"Slip Dress Dresses",
"Blue Dresses"
]
}
},
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N624151",
"_score" : 39.046432,
"_source" : {
"color" : [
"40"
],
"size" : [
"47",
"48",
"50",
"51"
],
"product_id" : "62415",
"name" : "Girls Short Sleeve Fashion Short Dress - Sky Blue",
"model" : "LYQ001",
"tag" : [
"Casual Dresses",
"Body Fitted Dresses",
"Short Sleeves Dresses",
"Slip Dress Dresses",
"Sky Blue Dresses"
]
}
},
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N624111",
"_score" : 38.569298,
"_source" : {
"color" : [
"40"
],
"size" : [
"47",
"48",
"50",
"51"
],
"product_id" : "62411",
"name" : "Girls Short Sleeve Fashion Short Dress - Navy blue",
"model" : "LYQ001",
"tag" : [
"Casual Dresses",
"Body Fitted Dresses",
"Round Neck Dresses",
"Slip Dress Dresses",
"Black Dresses"
]
}
},
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N624131",
"_score" : 37.646904,
"_source" : {
"color" : [
"40"
],
"size" : [
"47",
"48",
"50",
"51"
],
"product_id" : "62413",
"name" : "Girls Short Sleeve Fashion Short Dress - light blue",
"model" : "LYQ001",
"tag" : [
"Casual Dresses",
"Body Fitted Dresses",
"Short Gown Dresses",
"Slip Dress Dresses",
"light blue Dresses"
]
}
},
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N624141",
"_score" : 37.02933,
"_source" : {
"color" : [
"233"
],
"size" : [
"47",
"48",
"50",
"51"
],
"product_id" : "62414",
"name" : "Girls Short Sleeve Fashion Short Dress - Wine",
"model" : "LYQ001",
"tag" : [
"Casual Dresses",
"Body Fitted Dresses",
"Round Neck Dresses",
"Short Sleeves Dresses",
"Wine Red Dresses"
]
}
},
{
"_index" : "catalog",
"_type" : "_doc",
"_id" : "N624161",
"_score" : 36.39569,
"_source" : {
"color" : [
"84"
],
"size" : [
"47",
"48",
"50",
"51"
],
"product_id" : "62416",
"name" : "Girls Short Sleeve Fashion Short Dress - Rose",
"model" : "LYQ001",
"tag" : [
"Casual Dresses",
"Body Fitted Dresses",
"Short Gown Dresses",
"Slip Dress Dresses",
"Blue Dresses"
]
}
}