gpt4 book ai didi

java - Elasticsearch 多个值在没有分析器的情况下匹配

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:45:16 25 4
gpt4 key购买 nike

请原谅我对 ElasticSearch 的了解。我有一个 Elasticsearch 集合,其中包含如下文档:

{
"date": "2013-12-30T00:00:00.000Z",
"value": 2,
"dimensions": {
"region": "Coimbra District"

}
}
{
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Federal District"
}
}
{
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Masovian Voivodeship"
}
}

ES服务器中索引了这3个json文档。我没有提供任何分析器类型(也不知道如何提供一个 :))我正在使用 spring data Elasticsearch 并执行以下查询来搜索区域为“Masovian Voivodeship”或“Federal District”的文档:

{
"query_string" : {
"query" : "Masovian Voivodeship OR Federal District",
"fields" : [ "dimensions.region" ]
}
}

我预计它会返回 2 次匹配。但是,它会返回所有 3 个文档(可能是因为第 3 个文档中包含地区)。我如何修改查询以便它可以执行完全匹配并且只提供 2 个文档?我正在使用以下方法:

QueryBuilders.queryString(<OR string>).field("dimensions.region")

我已经尝试过 QueryBuilders.termsQueryQueryBuilders.inQueryQueryBuilders.matchQuery(带数组)但没有成功。

有人可以帮忙吗?提前致谢。

最佳答案

您可以在这里做几件事。

首先,我设置了一个没有任何显式映射或分析的索引,这意味着 standard analyzer将会被使用。这很重要,因为它决定了我们如何查询文本字段。

所以我开始:

DELETE /test_index

PUT /test_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}

PUT /test_index/doc/1
{
"date": "2013-12-30T00:00:00.000Z",
"value": 2,
"dimensions": {
"region": "Coimbra District"

}
}

PUT /test_index/doc/2
{
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Federal District"
}
}

PUT /test_index/doc/3
{
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Masovian Voivodeship"
}
}

然后我尝试了您的查询,但没有任何结果。我不明白为什么你的 fields 参数中有 "dimensions.ga:region",但是当我将它更改为 "dimensions.region" 我得到了一些结果:

POST /test_index/doc/_search
{
"query": {
"query_string": {
"query": "Masovian Voivodeship OR Federal District",
"fields": [
"dimensions.region"
]
}
}
}
...
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 0.46911472,
"hits": [
{
"_index": "test_index",
"_type": "doc",
"_id": "3",
"_score": 0.46911472,
"_source": {
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Masovian Voivodeship"
}
}
},
{
"_index": "test_index",
"_type": "doc",
"_id": "2",
"_score": 0.3533006,
"_source": {
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Federal District"
}
}
},
{
"_index": "test_index",
"_type": "doc",
"_id": "1",
"_score": 0.05937162,
"_source": {
"date": "2013-12-30T00:00:00.000Z",
"value": 2,
"dimensions": {
"region": "Coimbra District"
}
}
}
]
}
}

但是,这会返回您不想要的结果。一种解决方法如下:

POST /test_index/doc/_search
{
"query": {
"query_string": {
"query": "(Masovian AND Voivodeship) OR (Federal AND District)",
"fields": [
"dimensions.region"
]
}
}
}
...
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.46911472,
"hits": [
{
"_index": "test_index",
"_type": "doc",
"_id": "3",
"_score": 0.46911472,
"_source": {
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Masovian Voivodeship"
}
}
},
{
"_index": "test_index",
"_type": "doc",
"_id": "2",
"_score": 0.3533006,
"_source": {
"date": "2013-12-30T00:00:00.000Z",
"value": 1,
"dimensions": {
"region": "Federal District"
}
}
}
]
}
}

提供相同结果的另一种方法(我更喜欢这个)是使用 match query 的组合和 boolean should :

POST /test_index/doc/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"dimensions.region": {
"query": "Masovian Voivodeship",
"operator": "and"
}
}
},
{
"match": {
"dimensions.region": {
"query": "Federal District",
"operator": "and"
}
}
}
]
}
}
}

这是我使用的代码:

http://sense.qbox.io/gist/bb5062a635c4f9519a411fdd3c8540eae8bdfd51

关于java - Elasticsearch 多个值在没有分析器的情况下匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com