当前位置: 首页 > 面试题库 >

elasticsearch列的唯一过滤器不起作用(插入重复项)

田嘉慕
2023-03-14
问题内容

我已修改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以便将现有的重复值截断/删除

我在设置中做错了什么?


问题答案:

这是Elasticsearch无法为您提供的开箱即用的东西……您需要在应用程序中提供此唯一性功能。我能想到的唯一想法是将电话号码作为_id文档本身,并且每当您插入/更新某项内容时,ES都会使用contactNumberas
_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
}

createdfalse,这表示文档已更新,而不是创建。_version2再次表示,该文档已被更新。而且_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完全相同。



 类似资料:
  • 问题内容: 以下HTML,Javascript和JSON可以正确呈现,但该过滤器根本不起作用。我们做错了什么? Javascript: 这两个JSON: api / distributors / my: api /仪表板/目录 问题答案: 角度过滤器无法将对象的对象作为输入。ng- repeat可以渲染它们,但是过滤器需要一个对象数组。解决此问题的最简单方法是让服务器返回没​​有命名键的数组。您还

  • 我需要在表中插入所有单元格的唯一数据。我的表有3列,如果所有3个单元格的值相同,我需要忽略insert。 例如,我有一个表:|column_1 | column_2 | column_3| 以及此表的值: |val 1|val 2|val 3| |val 1|val 2|val 5| |val 1|val 2|val 3| |val 1|val 2|val 3| 所以我只需要插入值1和2,因为3和

  • 所以,基本上,前端使用reactJS,后端Spring Boot(微服务,zuul充当网关),当然,如果没有CORS的东西,他们什么也做不了。 我们使用了这段代码 它起作用了,但不再起作用了。我正在使用Postman检查发送回来的标头,但这些都不在那里。 我该怎么办?我可以在每个微服务中使用一个简单的CORS过滤器,但让Zuul处理这一切会容易得多。因为无论如何所有请求都会通过它。 有什么建议吗?

  • 问题内容: 我的映射是: 我想获取所有没有字段的文档。 我试过了: 返回所有文档。基于ElasticSearch2.x,存在用于嵌套字段的过滤器不起作用的问题,我也尝试过: 返回0个文档。 使所有缺少该字段的文档的正确查询是什么? 问题答案: 我找到了正确的语法,应该是:

  • 第一个命令从最后一个git提交中删除第一个单词,第二个命令尝试对apiendpoint进行调用,将该变量作为调用的一部分,第三个命令只打印该变量,以确保其正常工作。请参见下面的代码 当我运行那个bash脚本时,我从服务得到一个响应,说XML中的“Item没有正确设置”,但是它确实正确地回显了正确的变量。所以我知道第一线起作用了。如果我复制curl命令并将其粘贴到bash中,用实际值替换$somet

  • 这是回应的一部分 我有联系人号码和名字 现在我的第二个查询->我正在使用术语筛选器查询上面的联系电话