Elasticsearch: построить бинарную маску на основе фильтра - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть индекс ES продукты с такими данными (упрощенная версия, на самом деле около 20 полей):

{_id: 1, _score: 1, color: red, size: S}
{_id: 2, _score: 1, color: red, size: M}
{_id: 3, _score: 1, color: red, size: L}
{_id: 4, _score: 1, color: blue, size: S}
{_id: 5, _score: 1, color: blue, size: M}
{_id: 6, _score: 1, color: blue, size: L}

Я хочу фильтровать товары по атрибутам (цвети размер) но мне нужно, чтобы все они были представлены в результатах, условие фильтра должно влиять только на оценки.Примеры:

Query: color == red
Result:
{_id: 1, _score: 1}
{_id: 2, _score: 1}
{_id: 3, _score: 1}
{_id: 4, _score: 0}
{_id: 5, _score: 0}
{_id: 6, _score: 0}

Query: size == M
Result:
{_id: 1, _score: 0}
{_id: 2, _score: 1}
{_id: 3, _score: 0}
{_id: 4, _score: 0}
{_id: 5, _score: 1}
{_id: 6, _score: 0}

Query: color == red && size == M
Result:
{_id: 1, _score: 0}
{_id: 2, _score: 1}
{_id: 3, _score: 0}
{_id: 4, _score: 0}
{_id: 5, _score: 0}
{_id: 6, _score: 0}

Есть идеи, как мне этого добиться?Похоже ли это на работу упругого поиска?Может быть, я должен подумать о переключении другого магазина / базы данных.Версия ES 1.7.5

1 Ответ

0 голосов
/ 26 апреля 2018

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

POST /_search
{
   "query":{
      "bool":{
         "should":[
            {
               "constant_score":{
                  "filter":{
                     "term":{
                        "color":"red"
                     }
                  },
                  "boost":1
               }
            },
            {
               "bool":{
                  "must_not":{
                     "term":{
                        "color":"red"
                     }
                  },
                  "boost":0
               }
            }
         ]
      }
   }
}

, и результат будет

{
    "took": 3,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 6,
        "max_score": 1,
        "hits": [
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "2",
                "_score": 1,
                "_source": {
                    "color": "red",
                    "size": "M"
                }
            },
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "1",
                "_score": 1,
                "_source": {
                    "color": "red",
                    "size": "S"
                }
            },
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "3",
                "_score": 1,
                "_source": {
                    "color": "red",
                    "size": "L"
                }
            },
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "5",
                "_score": 0,
                "_source": {
                    "color": "blue",
                    "size": "M"
                }
            },
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "4",
                "_score": 0,
                "_source": {
                    "color": "blue",
                    "size": "S"
                }
            },
            {
                "_index": "test",
                "_type": "_doc",
                "_id": "6",
                "_score": 0,
                "_source": {
                    "color": "blue",
                    "size": "L"
                }
            }
        ]
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...