Трудность выполнения базового запроса Elasticsearch к набору данных - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь выполнить логический запрос к кластеру упругого поиска с базовым набором данных Шекспира. Я перепроверил много ресурсов, и все кажется правильным, но когда я его запускаю, speech_number оценивает операцию ИЛИ не работает должным образом.

Я просмотрел различные учебные пособия и документацию по логическим запросам эластичного поиска и до сих пор не выяснил, почему логика не работает должным образом.

"query": {
            "bool": {
                "must": [
                    {
                        "match": {"play_name": "Henry IV"}
                    },
                    {
                        "bool": {
                            "should": [
                                {"range": {"speech_number": {"lte": 50}}},
                                {"range": {"speech_number": {"gte": 4}}}
                            ]
                        }
                    }
                ]
            }
        }
    }

Пример файла shakespear.json, к которому я выполняю запросы, выглядит следующим образом:

{"line_id":1658,"play_name":"Henry IV","speech_number":26,"line_number":"3.1.108","speaker":"MORTIMER","text_entry":"Yea, but"}
{"index":{"_index":"shakespeare","_type":"line","_id":1658}}
{"line_id":1659,"play_name":"Henry IV","speech_number":26,"line_number":"3.1.109","speaker":"MORTIMER","text_entry":"Mark how he bears his course, and runs me up"}
{"index":{"_index":"shakespeare","_type":"line","_id":1659}}
{"line_id":1660,"play_name":"Henry IV","speech_number":26,"line_number":"3.1.110","speaker":"MORTIMER","text_entry":"With like advantage on the other side;"}
{"index":{"_index":"shakespeare","_type":"line","_id":1660}}
{"line_id":1661,"play_name":"Henry IV","speech_number":26,"line_number":"3.1.111","speaker":"MORTIMER","text_entry":"Gelding the opposed continent as much"}
{"index":{"_index":"shakespeare","_type":"line","_id":1661}}
{"line_id":1662,"play_name":"Henry IV","speech_number":26,"line_number":"3.1.112","speaker":"MORTIMER","text_entry":"As on the other side it takes from you."}
{"index":{"_index":"shakespeare","_type":"line","_id":1662}}
{"line_id":1663,"play_name":"Henry IV","speech_number":27,"line_number":"3.1.113","speaker":"EARL OF WORCESTER","text_entry":"Yea, but a little charge will trench him here"}
{"index":{"_index":"shakespeare","_type":"line","_id":1663}}
{"line_id":1664,"play_name":"Henry IV","speech_number":27,"line_number":"3.1.114","speaker":"EARL OF WORCESTER","text_entry":"And on this north side win this cape of land;"}
{"index":{"_index":"shakespeare","_type":"line","_id":1664}}
{"line_id":1665,"play_name":"Henry IV","speech_number":27,"line_number":"3.1.115","speaker":"EARL OF WORCESTER","text_entry":"And then he runs straight and even."}
{"index":{"_index":"shakespeare","_type":"line","_id":1665}}
{"line_id":1666,"play_name":"Henry IV","speech_number":28,"line_number":"3.1.116","speaker":"HOTSPUR","text_entry":"Ill have it so: a little charge will do it."}
{"index":{"_index":"shakespeare","_type":"line","_id":1666}}
{"line_id":1667,"play_name":"Henry IV","speech_number":29,"line_number":"3.1.117","speaker":"GLENDOWER","text_entry":"Ill not have it alterd."}
{"index":{"_index":"shakespeare","_type":"line","_id":1667}}
{"line_id":1668,"play_name":"Henry IV","speech_number":30,"line_number":"3.1.118","speaker":"HOTSPUR","text_entry":"Will not you?"}
{"index":{"_index":"shakespeare","_type":"line","_id":1668}}
{"line_id":1669,"play_name":"Henry IV","speech_number":31,"line_number":"3.1.119","speaker":"GLENDOWER","text_entry":"No, nor you shall not."}
{"index":{"_index":"shakespeare","_type":"line","_id":1669}}
{"line_id":1670,"play_name":"Henry IV","speech_number":32,"line_number":"3.1.120","speaker":"HOTSPUR","text_entry":"Who shall say me nay?"}
{"index":{"_index":"shakespeare","_type":"line","_id":1670}}
{"line_id":1671,"play_name":"Henry IV","speech_number":33,"line_number":"3.1.121","speaker":"GLENDOWER","text_entry":"Why, that will I."}

Ожидаемый результат должен быть следующим: play_name AND (speech_number <= 50 OR speech_number> = 4) Что я получаю: play_name AND (speech_number <= 50 AND speech_number> = 4)

1 Ответ

0 голосов
/ 29 марта 2019

Вы правы, запрос выполняется:

  • Должно совпадать: 1) Любое из слов из «Генриха IV» [1 см. Ниже] 2) A speech_number <= 50 [ИЛИ] <code>speech_number> = 4

То, что Elasticsearch также делает, назначает оценку: поэтому все внутри must должно совпадать, а затем все в should запросах улучшает результаты (по крайней мере один из should должен совпадать)

Чтобы увеличить большее speech_number больше ( не делайте этого ), вы можете иметь больше соответствующих should операторов:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": { 
                        "play_name": "Henry IV"
                    }
                },

                {
                    "bool": {
                        "should": [
                            {
                                "range": {
                                    "speech_number": { "lte": 50 }
                                }
                            },

                            {
                                "range": {
                                    "speech_number": { "lte": 40 }
                                }
                            },

                            {
                                "range": {
                                    "speech_number": { "lte": 30 }
                                }
                            },

                            ...
                        ]
                    }
                }
            ]
        }
    }
}

Таким образом, часть проблемы может быть lte: 50, которая допускает <4, и <code>gte:4> 50. Но я не вижу посторонних в ваших результатах. Если это заказ. range также допускает повышение (https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html),, поэтому вместо того, чтобы записывать несколько диапазонов, вы можете иметь:

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": { 
                        "play_name": "Henry IV",
                        "operator": "and
                    }
                },

                {
                    "bool": {
                        "should": [
                            {
                                "range": {
                                    "speech_number": { 
                                        "gte": 25,
                                        "lte": 50,

                                        "boost": 3
                                    }
                                }
                            },

                            {
                                "range": {
                                    "speech_number": { 
                                        "gte": 4,
                                        "lte": 50
                                    }
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

[1 *] соответствует по умолчанию ИЛИ: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html, если ваши данные структурированы, термин или добавление к нему оператора and - это больше, чем вы хотите. Не проблема вашего вопроса :)

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