Два фильтра (ДИАПАЗОН) в разных полях эластичного поиска - PullRequest
0 голосов
/ 18 апреля 2020

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

Этот фильтр работает нормально:

"range": {"pgrk": {"gte": 1, "lte": 10}}

Может кто-нибудь сказать мне, почему этот второй фильтр ниже не работает?

"should": {"range": {"url_length": {"lte": 100}}

------------------ -------- Следуйте моему запросу ниже с двумя фильтрами --------------------------

 {

    "from" : 0, "size" : 10,

    "sort" : [
            { "pgrk" : {"order" : "desc"} },

             { "url_length" : {"order" : "asc"} }
        ],

        "query": {

    "bool": {
    "must": {

    "multi_match" : {
    "query": "netflix",

    "type": "cross_fields",
    "fields": [ "titulo", "descricao", "url" ],
    "operator": "and"
            }
         },
         "filter": {
         "range" : {"pgrk" : { "gte" : 1, "lte" : 10}    }
          },


    "should" : {
            "range" : {"url_length" : { "lte" : 100 } }
            }

            }
    }


          }

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

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

Пожалуйста, прокомментируйте, чтобы я мог изменить, если его результаты не соответствуют вашим требованиям.

Индекс Def

{
    "mappings": {
        "properties": {
            "title": {
                "type": "text"
            },
            "url": {
                "type": "keyword"
            },
            "pgrk": {
                "type": "integer"
            },
            "url_length": {
                "type": "integer"
            }
        }
    }
}

Индекс образца документов

{
    "title": "netflix",
    "url" : "www.netflix.com", --> this shouldn't match as `pgrk > 10`
    "pgrk": 12,
    "url_length" : 50
}

{
    "title": "Netflix",  --> this should match both filetrs
    "url" : "www.netflix.com",
    "pgrk": 8,
    "url_length" : 50
}

{
    "title": "Netflix", --> this should match both filetrs
    "url" : "www.netflix",
    "pgrk": 5,
    "url_length" : 50
}

{"title": "netflix", "url": "www.netflix", "pgrk": 5, "url_length": 80. -> примечание pgrk имеет то же значение 5, что и prev и url_length is diff}

Поисковый запрос

{
    "from": 0,
    "size": 10,
    "sort": [
        {
            "pgrk": {
                "order": "desc"
            }
        },
        {
            "url_length": {
                "order": "asc"
            }
        }
    ],
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "query": "netflix",
                    "type": "cross_fields",
                    "fields": [
                        "title",
                        "url"
                    ],
                    "operator": "and"
                }
            },
            "filter": [ --> note filter array to have multiple range queries in filter context
                {
                    "range": {
                        "pgrk": {
                            "gte": 1,
                            "lte" : 10
                        }
                    }
                },
                {
                    "range": {
                        "url_length": {
                            "lte": 100
                        }
                    }
                }
            ]
        }
    }
}

И результат поиска, который приносит только три документа (даже 2 имеет одинаковое значение pgrk)

 "hits": [
            {
                "_index": "so_range",
                "_type": "_doc",
                "_id": "1",
                "_score": null,
                "_source": {
                    "title": "netflix",
                    "url": "www.netflix.com",
                    "pgrk": 8,
                    "url_length": 50
                },
                "sort": [
                    8,
                    50
                ]
            },
            {
                "_index": "so_range",
                "_type": "_doc",
                "_id": "3",
                "_score": null,
                "_source": {
                    "title": "netflix",
                    "url": "www.netflix",
                    "pgrk": 5,
                    "url_length": 50
                },
                "sort": [
                    5,
                    50
                ]
            },
            {
                "_index": "so_range",
                "_type": "_doc",
                "_id": "4",
                "_score": null,
                "_source": {
                    "title": "netflix",
                    "url": "www.netflix",
                    "pgrk": 5,
                    "url_length": 80
                },
                "sort": [
                    5,
                    80
                ]
            }
        ]
0 голосов
/ 20 апреля 2020

@ Opster

Как дела?

потому что, когда я использую в запросе функцию (From / Size), она не возвращает do c, который я надеюсь возвращение. Например, у меня есть 5 документов вasticsearch, все документы в последовательности, id 1, id 2, id 3, id 4, id 5.

В do c ID 5 есть слово (car) и в запросе, который я говорю, чтобы получить слово (автомобиль) из идентификатора 4 («от»: 4, «размер»: 1,), он не возвращает идентификатор 5, у него есть слово (автомобиль), но в запросе I положить информацию, которая существует в do c 5, поэтому я должен принести do c 5, но это не так и говорит, что не нашел результата. Если я поставлю запрос с идентификатором 0 («from»: 0, «size»: 1,), он найдет идентификатор 5. Похоже, чтоasticsearch путает с идентификаторами. Можете ли вы сказать мне, что происходит с идентификаторами?

Запрос ниже от идентификатора 4 не возвращает идентификатор 5, но если я поставлю запрос с идентификатором 0, то он возвращает идентификатор 5

{
"from": 4, "size": 1,
"query": {
"multi_match": {
"query": "car",

   "type": "cross_fields",
   "fields": ["title", "description", "url"],
   "operator": "and"
}
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...