Основываясь на обсуждении, которое мы имеем в качестве комментариев, теперь я могу понять, что вы имели в виду и в чем заключается ваша настоящая проблема.
Когда вы используете значения по умолчанию вasticsearch ,asticsearch анализирует ваш текст с помощью стандартный анализатор , который в основном разбивает ваш текст на токены.При поиске в этом поле с запросом на совпадение применяется тот же самый процесс анализа.Это означает, что текст вашего запроса также разбит на токены.Запрос match
запускает «или» на всех сгенерированных токенах.
В следующем примере, который можно скопировать и вставить в консоли разработчика Kibana, показано, что:
DELETE test
PUT test
PUT test/_doc/1
{
"name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
PUT test/_doc/2
{
"name": "추성훈의 기모본딩바지 4종"
}
GET test/_search
{
"query": {
"match": {
"name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
}
}
Он дает следующеерезультат:
{
"took" : 12,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 1.7260926,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.7260926,
"_source" : {
"name" : "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
},
{
"_index" : "test",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.8630463,
"_source" : {
"name" : "추성훈의 기모본딩바지 4종"
}
}
]
}
}
Если вы не определили какой-либо анализатор в настройках индекса, то, вероятно ,asticsearch сгенерировал подполе .keyword
, которое не анализируется.Вы можете запросить его следующим образом:
GET test/_search
{
"query": {
"term": {
"name.keyword": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
}
}
Теперь это дает только точные совпадения:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.2876821,
"hits" : [
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.2876821,
"_source" : {
"name" : "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
}
]
}
}
Если вы знаете, что вы никогда не собираетесь запускать полнотекстовый поиск, а только точное совпадение, товам не нужно агрегировать или сортировать по полю name
, тогда вы можете определить свой индекс следующим образом:
DELETE test
PUT test
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "text",
"analyzer": "keyword"
}
}
}
}
}
PUT test/_doc/1
{
"name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
PUT test/_doc/2
{
"name": "추성훈의 기모본딩바지 4종"
}
GET test/_search
{
"query": {
"term": {
"name": "추성훈의 코몽트 기모본딩바지 3+1종_총 4종"
}
}
}
Это также дает один единственный результат и требует меньше места на диске, чем поведение по умолчанию.