Elasticsearch - Как перечислить точное совпадение наверху - PullRequest
0 голосов
/ 05 октября 2018

Я ищу слово «Адана» в Elasticsearch и хочу, чтобы оно было на вершине, потому что это точное слово, но это не так.

Вместо этого «Bilmemne Adana Otel» стоит на вершине.

Нормальный запрос не приносит никакой пользы, поэтому я пробовал логический запрос с «must» и «must».Но это тоже ничего не меняет.

В дополнение к этому, если я напишу «Ада», «Адана» тоже должна стоять на первом месте.

Как мы можем заставить ее работать правильно?

Запрос:

curl -X GET "localhost:9200/destinations/_search" -H 'Content-Type: 
application/json' -d'
{
 "query": {
   "match": {
     “Name”: {
       "query": “Adana”
      }
    }
  }
}
'

Результат:

{
"took" : 16,
"timed_out" : false,
"_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
},
"hits" : {
    "total" : 3,
    "max_score" : 3.255435,
    "hits" : [
    {
        "_index" : "destinations",
        "_type" : "_doc",
        "_id" : "10",
        "_score" : 3.255435,
        "_source" : {
        "name" : "Bilmemne Adana Otel"
        }
    },
    {
        "_index" : "destinations",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 2.8624198,
        "_source" : {
        "name" : "Adana"
        }
    },
    {
        "_index" : "destinations",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 2.3216834,
        "_source" : {
        "name" : "Adana Airport Otel - Adana"
        }
    }
    ]
}
}

Индекс:

{
"settings": {
    "analysis": {
    "filter": {
        "autocomplete_filter": {
        "type": "edge_ngram",
        "min_gram": 2,
        "max_gram": 15
        }
    },
    "analyzer": {
        "autocomplete": { 
        "type": "custom",
        "tokenizer": "standard",
        "filter": [
            "lowercase",
            "autocomplete_filter"
        ]
        }
    }
    }
},
"mappings": {
    "_doc": {
    "properties": {
        "name": {
        "type": "text",
        "analyzer": "autocomplete", 
        "search_analyzer": "standard" 
        }
    }
    }
}
}

1 Ответ

0 голосов
/ 05 октября 2018

Если вы хотите, чтобы ваши точные совпадения были на вершине, вы можете использовать поле keyword в вашем отображении.

{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 15
        }
      },
      "analyzer": {
        "autocomplete": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          },
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
  }
}

Тогда у вас может быть запрос bool, который использует ваш keywordв запросе should.

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "Adana"
          }
        }
      ],
      "should": [
        {
          "term": {
            "name.keyword": {
              "value": "Adana"
            }
          }
        }
      ]
    }
  }
}

Это должно подтолкнуть точное совпадение к вершине.

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