как использовать должны и должны в elasti c поиск - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть данные вasticsearch, как это:

{
    a : "status",
    b : "01"
},
{
    a : "status b",
    b : "02"
}

Я хочу получить все данные с must и should

Я пробовал с must и should запрос как этот

{
  "query": {
    "bool": {
      "must":[
        {
          "match": {
            "a": "status b"
          }
        }],
      "should":[ {
        "match": {
          "b": "01"
        }
      }]
    }
  }
}

но запрос should не работает, кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

То, что включено в оператор must, должно обязательно появиться в документе, чтобы быть уверенным, что оно включено в список итоговых документов, и вы можете включить более 1 условия, выступающего в качестве логической операции AND. Условие, включенное в should оператор необязателен, если документ удовлетворяет этому условию, будет включен в результат, и если он не будет включен, он также будет включен, но результат будет другим, как показано ниже в списке результатов.

Кроме того, вы должны принять во внимание, что условие "статус b" маркируется в зависимости от вашего analyzer. Таким образом, если вы используете анализатор по умолчанию, токенами являются «status» и «b», поэтому любой документ, содержащий одно из этих значений, будет выполнять условие, действующее как логический оператор OR.

0 голосов
/ 17 апреля 2020

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

Вы также можете проверить, как ваши данные индексируются, используя _analyze API, который поможет вам эффективно отладить проблему. Кроме того, используйте объяснение API , которое скажет вам, почему ваше предложение should не соответствует ни одному do c.

Индекс def

{
    "mappings": {
        "properties": {
            "a": {
                "type": "text"
            },
            "b": {
                "type": "integer"
            }
        }
    }
}

Примеры документов индекса

{
    a : "status",
    b : "01"
},
{
    a : "status b",
    b : "02"
}

Примечание: поисковый запрос также совпадает с вашим

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "a": "status b"
                    }
                }
            ],
            "should": [
                {
                    "match": {
                        "b": "01"
                    }
                }
            ]
        }
    }
}

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

"hits": [
            {
                "_index": "so_must_should",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.2111092,
                "_source": {
                    "a": "status",
                    "b": "01"
                }
            },
            {
                "_index": "so_must_should",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.77041256,
                "_source": {
                    "a": "status b",
                    "b": "02"
                }
            }
        ]

Пожалуйста, перепроверьте свое сопоставление и сравните его с этим образцом, и дайте мне знать, если у вас есть дополнительные вопросы.

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