elasticsearch,elastic-stack,Java,Amazon Web Services,elasticsearch,Elastic Stack" /> elasticsearch,elastic-stack,Java,Amazon Web Services,elasticsearch,Elastic Stack" />

Java 弹性搜索精确匹配查询问题

Java 弹性搜索精确匹配查询问题,java,amazon-web-services,elasticsearch,elastic-stack,Java,Amazon Web Services,elasticsearch,Elastic Stack,我在查询弹性搜索时遇到问题。以下是我的疑问 GET _search { "query": { "bool": { "must": [{ "match": { "name": "SomeName" } }, { "match": { "type": "S

我在查询弹性搜索时遇到问题。以下是我的疑问

GET _search {
"query": {
    "bool": {
        "must": [{
                "match": {
                    "name": "SomeName"
                }
            },
            {
                "match": {
                    "type": "SomeType"
                }
            },
            {
                "match": {
                    "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
                }
            },
            {
                "range": {
                    "request_date": {
                        "from": "2018-08-22T12:16:37,392",
                        "to": "2018-08-28T12:17:41,137",
                        "format": "YYYY-MM-dd'T'HH:mm:ss,SSS"
                    }
                }
            }

        ]
    }
}
}

我在bool查询中使用了三个匹配查询和一个范围查询。我的目的是得到这些完全匹配的文档,并且在这个日期范围内。在这里,如果我更改名称和类型值,就不会得到结果。但对于productId,如果我只输入ff134be8,我将得到结果。有人知道为什么吗。精确匹配适用于名称和类型,但不适用于productId

您需要将productId映射到
关键字以避免标记化。使用标准标记器“ff134be8-10fc-4461-b620-79s51199c7qb”
将创建
[“ff134be8”、“10fc”、“4461”、“b620”、“79s51199c7qb”]
作为标记

您有不同的选择:

1/在不分析字段内容的情况下,使用a进行检查

...
    {
        "term": {
            "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
        }
    },
    ...
2/如果您使用Elasticsearch 6.X,您可以将请求更改为

...
{
    "match": {
        "productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"
    }
},
...
由于elasticsearch将为所有字符串字段创建一个子字段
关键字
,其类型为
关键字


当然,最好的选择是第一个。如果您试图匹配确切的内容,请始终使用术语查询。

您需要将productId映射到
关键字
,以避免标记化。使用标准标记器“ff134be8-10fc-4461-b620-79s51199c7qb”将创建
[“ff134be8”、“10fc”、“4461”、“b620”、“79s51199c7qb”]
作为标记

您有不同的选择:

1/在不分析字段内容的情况下,使用a进行检查

...
    {
        "term": {
            "productId": "ff134be8-10fc-4461-b620-79s51199c7qb"
        }
    },
    ...
2/如果您使用Elasticsearch 6.X,您可以将请求更改为

...
{
    "match": {
        "productId.keyword": "ff134be8-10fc-4461-b620-79s51199c7qb"
    }
},
...
由于elasticsearch将为所有字符串字段创建一个子字段
关键字
,其类型为
关键字


当然,最好的选择是第一个。如果您试图匹配确切的内容,请始终使用术语查询。

您也可以发布映射吗?您使用哪个elasticsearch版本?顺便说一句,如果您需要精确的检查,您应该实现一个术语查询而不是匹配查询。请提供有关您的查询的更多信息,例如您是否使用kibana或任何java客户机来获取information@EiriniGraonidou,我没有使用任何映射。AWS kinesis正在将条目写入ES。根据我们传递的数据,它会自动创建映射。您也可以发布映射吗?您使用哪个elasticsearch版本?顺便说一句,如果您需要精确的检查,您应该实现一个术语查询而不是匹配查询。请提供有关您的查询的更多信息,例如您是否使用kibana或任何java客户机来获取information@EiriniGraonidou,我没有使用任何映射。AWS kinesis正在将条目写入ES。根据我们传递的数据,它会自动创建映射。如果我使用第一个解决方案,我可以包含多个术语要求吗?我还需要把另外两件东西搭配起来。顺便说一句,第二个解决方案有效:)您可以使用术语:{productId:['ff134be8-10fc-4461-b620-79s51199c7qb','xxx xxx xxxx']}如果我使用第一个解决方案,我可以包括多个术语要求吗?我还需要把另外两件东西搭配起来。通过第二个解决方案的工作方式:)您可以使用以下术语:{productId:['ff134be8-10fc-4461-b620-79s51199c7qb','xxx xxx xxxx']}