我已将contactNumber
字段修改为unique
过滤器
通过更新索引设置如下
curl -XPUT localhost:9200/test-index2/_settings -d '
{
"index":{
"analysis":{
"analyzer":{
"unique_keyword_analyzer":{
"only_on_same_position":"true",
"filter":"unique"
}
}
}
},
"mappings":{
"business":{
"properties":{
"contactNumber":{
"analyzer":"unique_keyword_analyzer",
"type":"string"
}
}
}
}
}'
示例项看起来像这样,
doc_type:"Business"
contactNumber:"(+12)415-3499"
name:"Sam's Pizza"
address:"Somewhere on earth"
过滤器不起作用,因为插入了重复的项目,我希望否两个具有相同contactNumber的文档
在上面,我还设置了only_on_same_position
- > true
以便截断/删除现有的重复值
我在设置中做错了什么?
答案 0 :(得分:1)
Elasticsearch无法帮助您开箱即用...您需要在应用中提供此唯一性功能。我能想到的唯一想法是将电话号码作为文档本身的_id
,每当您插入/更新某些内容时,ES都会使用contactNumber
作为_id
,它将会将该文档与已存在的文档相关联或创建一个新文档。
例如:
PUT /test-index2
{
"mappings": {
"business": {
"_id": {
"path": "contactNumber"
},
"properties": {
"contactNumber": {
"type": "string",
"analyzer": "keyword"
},
"address": {
"type": "string"
}
}
}
}
}
然后你索引一些东西:
POST /test-index2/business
{
"contactNumber": "(+12)415-3499",
"address": "whatever 123"
}
取回它:
GET /test-index2/business/_search
{
"query": {
"match_all": {}
}
}
看起来像这样:
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test-index2",
"_type": "business",
"_id": "(+12)415-3499",
"_score": 1,
"_source": {
"contactNumber": "(+12)415-3499",
"address": "whatever 123"
}
}
]
}
您看到该文档的_id
是电话号码本身。如果您想要更改或插入其他文档(地址不同,则会有一个新字段 - whatever_field
- 但contactNumber
是相同的):
POST /test-index2/business
{
"contactNumber": "(+12)415-3499",
"address": "whatever 123 456",
"whatever_field": "whatever value"
}
Elasticserach"更新"现有文件并回复:
{
"_index": "test-index2",
"_type": "business",
"_id": "(+12)415-3499",
"_version": 2,
"created": false
}
created
是false
,这意味着文档已更新,未创建。 _version
是2
,它再次表示文档已更新。而_id
是电话号码本身,表示这是已更新的文件。
再看一下索引,ES存储了这个:
"hits": [
{
"_index": "test-index2",
"_type": "business",
"_id": "(+12)415-3499",
"_score": 1,
"_source": {
"contactNumber": "(+12)415-3499",
"address": "whatever 123 456",
"whatever_field": "whatever value"
}
}
]
因此,新字段已存在,地址已更改,contactNumber
和_id
完全相同。