Комбинация Should и Filter в ElasticSearch

У меня есть этот запрос, который возвращает правильный результат

GET /person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "fuzzy": {
            "nameDetails.name.nameValue.surname": {
              "value": "Pibba",
              "fuzziness": "AUTO"
            }
          }
        },
        {
          "fuzzy": {
            "nameDetails.nameValue.firstName": {
              "value": "Fawsu",
              "fuzziness": "AUTO"
            }
          }
        }
      ]
    }
  }
}

и результат ниже:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 3.6012557,
    "hits" : [
      {
        "_index" : "person",
        "_type" : "_doc",
        "_id" : "70002",
        "_score" : 3.6012557,
        "_source" : {
          "gender" : "Male",
          "activeStatus" : "Inactive",
          "deceased" : "No",
          "nameDetails" : {
            "name" : [
              {
                "nameValue" : {
                  "firstName" : "Fawsu",
                  "middleName" : "L.",
                  "surname" : "Pibba"
                },
                "nameType" : "Primary Name"
              },
              {
                "nameValue" : {
                  "firstName" : "Fausu",
                  "middleName" : "L.",
                  "surname" : "Pibba"
                },
                "nameType" : "Spelling Variation"
              }
            ]
          }              
        }
      }
    ]
  }

Но когда я добавляю filter для Gender, он не возвращает результата

GET /person/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "fuzzy": {
            "nameDetails.name.nameValue.surname": {
              "value": "Pibba",
              "fuzziness": "AUTO"
            }
          }
        },
        {
          "fuzzy": {
            "nameDetails.nameValue.firstName": {
              "value": "Fawsu",
              "fuzziness": "AUTO"
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "gender": "Male"
          }
        }
      ]
    }
  }
}

Даже я просто использую filter, он не возвращает результата

GET /person/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "gender": "Male"
          }
        }
      ]
    }
  }
}
0
0
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не получаете никаких результатов поиска, потому что вы используете термин запрос (в предложении фильтра). Термин запрос вернет документ только в том случае, если он имеет точное соответствие.

Если не указан анализатор, используется стандартный анализатор, который преобразует Male в male. Таким образом, вы можете либо искать male вместо Male, либо использовать любое из следующих решений.


Если вы не определили явное отображение индекса, вам нужно добавить .keyword в поле gender. При этом используется анализатор ключевых слов вместо стандартного анализатора (обратите внимание на «.keyword» после поля gender). Попробуйте этот запрос ниже -

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "gender.keyword": "Male"
          }
        }
      ]
    }
  }
}

Результат поиска:

"hits": [
      {
        "_index": "66879128",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.0,
        "_source": {
          "gender": "Male",
          "activeStatus": "Inactive",
          "deceased": "No",
          "nameDetails": {
            "name": [
              {
                "nameValue": {
                  "firstName": "Fawsu",
                  "middleName": "L.",
                  "surname": "Pibba"
                },
                "nameType": "Primary Name"
              },
              {
                "nameValue": {
                  "firstName": "Fausu",
                  "middleName": "L.",
                  "surname": "Pibba"
                },
                "nameType": "Spelling Variation"
              }
            ]
          }
        }
      }
    ]

Если вы определили отображение индекса, измените отображение для поля gender, как показано ниже.

{
  "mappings": {
    "properties": {
      "gender": {
        "type": "keyword"
      }
    }
  }
}

Другие вопросы по теме