проблемы с запросомasticSearch и вложенным объектом - PullRequest
0 голосов
/ 28 октября 2019

У меня проблема с запросом ElasticSearch. Я хотел бы найти документы по двум значениям во вложенном объекте, и у меня должен быть такой результат:

{
    "took": 36,
    "timed_out": false,
    "_shards": {
        "total": 6,
        "successful": 6,
        "failed": 0
    },
    "hits": {
        "total": 2,
        "max_score": 6.3647356,
        "hits": [
            {
                "_index": "product2019",
                "_type": "product",
                "_id": "2561571",
                "_score": 6.3647356,
                "_source": {
                    "attribute": [
                        {
                            "value": "api gl2",
                            "type": "887",
                            "lang": "fr",
                            "country": "FR",
                            "numpro": "887"
                        }
                    ],
                    "idProduct": "2561571",
                    "type": "ARTICLE"
                }
            },
            {
                "_index": "product2019",
                "_type": "product",
                "_id": "2562471",
                "_score": 6.3647356,
                "_source": {
                    "attribute": [
                        {
                            "value": "api gl2",
                            "type": "887",
                            "lang": "fr",
                            "country": "FR",
                            "numpro": "887"
                        }
                    ],
                    "idProduct": "2562471",
                    "type": "ARTICLE"
                }
            }
        ]
    }
}

Но с моим запросом у меня не очень хороший результат. Вот мой запрос:

{
    "size": 500,
    "query": {
        "bool": {
            "must": {
            "nested": {
                    "query": {
                    "bool": {
                        "must": [
                        {
                            "term": {
                            "attribute.numpro": "887"
                            }
                        },
                        {
                            "term": {
                            "attribute.value": "api gl2"
                            }
                        }
                        ]
                    }
                    },
                    "path": "attribute"
                }
            },
            "minimum_should_match": "1"
        }
    }
}

с этим запросом результат = 0. Кто-то может объяснить мне, почему у меня нет правильного результата?

и это мое отображение:

{
    "mappings":{
        "product":{
            "properties":{
                "type":{
                    "index":"not_analyzed",
                    "type":"string"
                },
                "idProduct":{
                    "index":"not_analyzed",
                    "type":"string"
                },
                "attribute":{
                    "type":"nested",
                    "properties":{
                        "country":{
                            "index":"not_analyzed",
                            "type":"string"
                        },
                        "lang":{
                            "index":"not_analyzed",
                            "type":"string"
                        },
                        "type":{
                            "index":"not_analyzed",
                            "type":"string"
                        },
                        "value":{
                            "analyzer":"french",
                            "type":"string",
                            "fields":{
                                "value.lowercase":{
                                    "analyzer":"lowercase",
                                    "type":"string"
                                },
                                "value.notanalyzed":{
                                    "index":"not_analyzed",
                                    "type":"string"
                                },
                                "value.alphanumlower":{
                                    "analyzer":"alphanumlower",
                                    "type":"string"
                                }
                            }
                        },
                        "numpro":{
                            "type":"long"
                        }
                    }
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Похоже, что вы используете синтаксис Elasticsearch 2.x.

Для мультиполей вам не нужно повторять имя поля (например, вместо "value.lowercase": просто используйте "lowercase":).

С этим исправлением ваше отображение должно выглядеть следующим образом:

{
    "mappings":{
        "product":{
            "properties":{
                "type":{
                    "index":"not_analyzed",
                    "type":"string"
                },
                "idProduct":{
                    "index":"not_analyzed",
                    "type":"string"
                },
                "attribute":{
                    "type":"nested",
                    "properties":{
                        "country":{
                            "index":"not_analyzed",
                            "type":"string"
                        },
                        "lang":{
                            "index":"not_analyzed",
                            "type":"string"
                        },
                        "type":{
                            "index":"not_analyzed",
                            "type":"string"
                        },
                        "value":{
                            "analyzer":"french",
                            "type":"string",
                            "fields":{
                                "lowercase":{
                                    "analyzer":"lowercase",
                                    "type":"string"
                                },
                                "notanalyzed":{
                                    "index":"not_analyzed",
                                    "type":"string"
                                },
                                "alphanumlower":{
                                    "analyzer":"alphanumlower",
                                    "type":"string"
                                }
                            }
                        },
                        "numpro":{
                            "type":"long"
                        }
                    }
                }
            }
        }
    }
}

В вашем запросе необходимо выполнить запрос к неанализированной версии вашего мультиполя:

{
    "term": {
        "attribute.value.notanalyzed": "api gl2"
    }
}

Имейте в виду, что в ваших попаданиях вы все равно увидите все атрибуты соответствующих документов. Если вы хотите, чтобы Elasticsearch также возвращал определенный атрибут, вызвавший совпадение, вы должны добавить "inner_hits" : {} к вашему вложенному запросу.

К сожалению, я не могу проверить код, поскольку у меня больше нет Elasticsearch v2.x илиv5.x под рукой. Начиная с версии 5 Elasticsearch, тип string был заменен типами text (проанализировано) и keyword (не проанализировано). По умолчанию теперь строки отображаются в мультиполе, где <field-name> относится к анализируемому текстовому полю, а <field-name>.keyword относится к неанализированному полю ключевого слова. Если вы используете Elasticsearch версии 5, вы можете рассмотреть возможность использования синтаксиса версии 5. Это упростит сопоставления.

Например, это сопоставление версии 2:

"lang":{
    "index":"not_analyzed",
    "type":"string"
}

будет выглядеть такэто в версии 5:

"lang":{
    "type":"keyword"
}

Дайте мне знать, если это решило вашу проблему.

0 голосов
/ 29 октября 2019

Поскольку вы проверяете точное совпадение, используя термин запрос. Вам нужно использовать "attribute.value.notanalyzed"

И ваше отображение

"notanalyzed": 
{
   "type": "text",
   "index":"not_analyzed"
}
```

should be

"notanalyzed": {"type": "keyword"}


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