2013-05-21 260 views
3

我已经插入3条记录在我的ElasticSearch指标如下:ElasticSearch查询/检索/匹配

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1' -d ' 
{ "cityNames" : [ { "language" : "ENG", 
    "name" : "w bridgewater", 
    "raw_name" : "W BRIDGEWATER" 
    }, 
    { "language" : "ENG", 
    "name" : "west bridgewater", 
    "raw_name" : "West Bridgewater" 
    } 
], 
"id" : 1, 
    "streetNames" : [ { "language" : "ENG", 
    "name" : "cram rd", 
    "raw_name" : "Cram Rd" 
    } ] 
}' 

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1' -d ' 
{ "cityNames" : [ { "language" : "ENG", 
    "name" : "bridgewater corners", 
    "raw_name" : "BRIDGEWATER CORNERS" 
    }, 
    { "language" : "ENG", 
    "name" : "bridgewater center", 
    "raw_name" : "Bridgewater Center" 
    } 
], 
"id" : 2, 
"streetNames" : [ { "language" : "ENG", 
    "name" : "valley view rd", 
    "raw_name" : "Valley View Rd" 
    } ] 
}' 

curl -XPOST 'http://127.0.0.1:9200/geoindex_test/STREET?pretty=1' -d ' 
{ "cityNames" : [ { "language" : "ENG", 
    "name" : "bridgewater", 
    "raw_name" : "Bridgewater" 
    }, 
    { "language" : "ENG", 
    "name" : "windsor", 
    "raw_name" : "Windsor" 
    } 
], 
"id" : 3, 
"streetNames" : [ { "language" : "ENG", 
    "name" : "valley view rd", 
    "raw_name" : "Valley View Rd" 
    } ] 
}' 

我执行搜索如下:

curl -XGET 'http://127.0.0.1:9200/geoindex_test/STREET/_search?pretty=1' -d ' 
{ 
"query" : { 
    "match" : { "cityNames.name" : "bridgewater" } 
} 
}' 

我想ElasticSearch将返回第三记录(id == 3)为最佳匹配(记录3与“bridgewater”唯一完全匹配),但是它将id 1(w bridgewater)的记录返回为最佳匹配。我究竟做错了什么?

+1

如果您在请求中启用解释输出,您可以看到详细的解释。只需将'explain = true'请求参数添加到url即可。如果您可以将输出添加到您的答案,我很乐意为您提供帮助。 – javanna

+0

@javanna - 谢谢你的回复。 explain = true的输出超出了stackoverflow允许的字符数。对不起,我无法提供信息。 –

+0

也许您可以发布相关部分或使用第三方服务,如pastebin或github主旨。 – javanna

回答

1

我想这是因为你正在使用内部对象,它基本上将它下面的对象折叠成一个用于搜索目的。因此,当您查询Object 1的搜索字段时,例如,您正在查询[“w bridgewater”,“west bridgewater”],而不是您想象的离散字段。

由于'bridgewater'在对象1和2(两个名称域)中出现两次,而在对象3中出现一次,因此这些项在搜索中排名较高。对象1最终被挑选出来,因为'桥水'出现的字段比对象2(“水桥”与“桥水角”)短。

不是像你在做的那样使用内部对象,而是使用嵌套对象代替http://www.elasticsearch.org/guide/reference/mapping/nested-type/。将分数模式设置为“最大”,然后将以更直观的方式为您匹配。

+0

你知道吗?我喜欢你编辑答案的方式,这很有道理!即使看到解释的输出总是有用的! – javanna

+0

解释说明你是对的,很好的答案! – javanna