2014-12-19 71 views
2

在這裏,我給我更新的映射如何在elasticsearch中進行完全匹配?

curl -X PUT localhost:9200/testing/listings/_mapping -d '{ 
    "listings" : { 
    "properties" : { 
     "address" : { 
      "properties": { 
       "location": { "type" : "string", 
          "index" : "not_analyzed" 
       } 
      } 
     }, 
     "suggest" : { "type" : "completion", 
         "index_analyzer" : "simple", 
         "search_analyzer" : "simple", 
         "payloads" : true 
     } 
     } 
    } 
}' 

我的映射如下

{ 
    "testing": { 
    "mappings": { 
     "listings": { 
     "properties": { 
      "address": { 
      "properties": { 
       "city": { 
       "type": "string" 
       }, 
       "line1": { 
       "type": "string" 
       }, 
       "line2": { 
       "type": "string" 
       }, 
       "line3": { 
       "type": "string" 
       }, 
       "location": { 
       "type": "string", 
       "index": "not_analyzed" 
       }, 
       "pincode": { 
       "type": "string" 
       } 
      } 
      }, 
      "title": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

但是我的數據不匹配創建的索引。

我的樣本數據是

{ 
    "listings": { 
    "title": "testing 3", 
    "address": { 
     "line1": "3rd cross", 
     "line2": "6th main", 
     "line3": "", 
     "landmark": "", 
     "location": "k r puram", 
     "pincode": "", 
     "city": "Bangalore" 
    } 
    } 
} 

當我給查詢作爲k r puram我得到了匹配的結果。

但是,當我給查詢爲r r puramr k puram那次我也得到了屬於k r puram的結果。

在上面的查詢中,我只列出了k r puram列表中的其他人我沒有列出所以除k r puram之外它應該給出空的結果。

這是我的查詢:

{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "published": true 
      } 
     }, 
     { 
      "match": { 
      "inActive": false 
      } 
     }, 
     { 
      "range": { 
      "propertyDetailsCategory.build_up_area": { 
       "lte": 200 
      } 
      } 
     }, 
     { 
      "match": { 
      "type": "commercial" 
      } 
     }, 
     { 
      "match": { 
      "purpose": "rent" 
      } 
     }, 
     { 
      "range": { 
      "commercialsCategory.exp_rent": { 
       "lte": 50000 
      } 
      } 
     }, 
     { 
      "match": { 
      "address.location": "k r puram" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

1.爲什麼要使用multi_match只針對單場? 2.「address.location」實際包含什麼? 3.如何分析? – 2014-12-19 11:34:23

+0

我也用那場比賽也是同樣的結果來了。 address.location包含位置,'address.location'是列表對象中的字段'。 @OllyCruickshank – 2014-12-19 11:39:06

+0

讓我重新解釋一下我的問題 - 「address.location」是否包含「kr puram」的確切值? – 2014-12-19 11:52:08

回答

3

如果數據恰好爲「k R puram」,你正在尋找確切爲「k R puram」 - 那麼你不應該使用一個分析器。

插入數據時,Elasticsearch的默認行爲是使用標準分析器。

要禁用此使用

"index": "not_analyzed" 

在映射爲適當的字段。


,如果你的映射如下:

curl -XPOST http://localhost:9200/index/address/_mapping -d ' 
{"address": { 
    "properties": { 
    "city": {"type": "string"}, 
    "line1": {"type": "string"}, 
    "line2": {"type": "string"}, 
    "line3": {"type": "string"}, 
    "location": { "type": "string", "index": "not_analyzed"}, 
    "pincode": {"type": "string"} 
}}}' 

那麼你的數據必須與之相匹配的,例如這不符合它:

curl -XPOST http://localhost:9200/index/address/ -d ' 
{"title":"testing", 
"address": 
     {"line1":"#51", 
     "line2":"3rd cross", 
     "line3":"6th main", 
     "location":"k r puram", 
     "pincode":"560041"}} 

然而,這比賽(我修改):

curl -XPOST http://localhost:9200/index/address/ -d ' 
{"line1":"#51", 
"line2":"3rd cross", 
"line3":"6th main", 
"location":"k r puram", 
"pincode":"560041"}' 

而這查詢發現按預期的文件:

curl -XGET http://localhost:9200/index/address/_search -d ' 
{ 
    "query" :{"match" : {"location": "k r puram"}} 
}' 

如果你不能改變你的數據,然後添加額外水平的映射,如:

curl -XPOST http://localhost:9200/index/address3/_mapping -d '{ 
    "address3" : { 
    "properties" : { 
     "address" : { 
     "properties" : { 
      "city" : { 
      "type" : "string" 
      }, 
      "line1" : { 
      "type" : "string" 
      }, 
      "line2" : { 
      "type" : "string" 
      }, 
      "location" : { 
      "type" : "string", "index": "not_analyzed" 
      } 
     } 
     }, 
     "title" : { 
     "type" : "string" 
    } 
    } 
} 
}' 

再次查詢工作良好:

curl -XGET http://localhost:9200/index/address3/_search -d ' 
{ 
    "query" :{"match" : {"address.location": "k r puram"}} 
}' 
+0

如果「索引」設置爲「not_analysed」,那麼elasticsearch將不會根據空間拆分文本,即整個文本將被視爲單個標記。因此,在搜索過程中將搜索完整的文本。另一個簡單的解決方案是在索引之前用空格替換一些其他字符。例如:「kr puram」=> k_r_puram。 – 2014-12-20 03:14:46

+0

@Olly我修改的映射是curl -X PUT localhost:9200/testing/listings/_mapping -d'{ 「listing」:{ 「properties」:{「address」:{ 「properties」:{ 「location 「:{ 「類型」: 「串」, 「索引」: 「not_analyzed」 } } }, 「建議」:{ 「類型」: 「完成」, 「index_analyzer」: 「簡單」, 「search_analyzer」:「簡單」, 「有效載荷」:真 } } } }' – 2014-12-23 12:31:25

+0

真棒,它工作嗎?如果是這樣,你能接受我的回答嗎? – 2014-12-23 12:36:57

0

你試過嗎? (使用。原子場的「不記號化」值)

{"query":{ 
    "bool":{ 
     "must":[ 
     {"match":{"published":true}}, 
     {"match":{"inActive":false}}, 
     {"range":{"propertyDetailsCategory.build_up_area":{"lte":200}}}, 
     {"match":{"type":"commercial"}}, 
     {"match":{"purpose":"rent"}}, 
     {"range":{"commercialsCategory.exp_rent":{"lte":50000}}}, 
     {"match":{"address.location.raw": "k r puram"}} 
    ] 
    } 
} 
} 

嘗試使用您的舊映射此查詢匹配值,它應該工作:)