2013-05-21 203 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