Solr不会覆盖 - 重复的uniqueKey条目

tom*_*m_w 7 java lucene solr solrj

我有Solr 5.3.1的问题.我的架构很简单.我有一个uniqueKey,它是作为字符串的"id".索引,存储和必需,非多值.

我首先使用"content_type:document_unfinished"添加文档,然后使用相同的id但另一个content_type:document 覆盖相同的文档.然后该文档在索引中两次.同样,唯一的uniqueKey是"id",作为字符串.id最初来自mysql-index primary int.

看起来这不仅发生一次:

http://lucene.472066.n3.nabble.com/uniqueKey-not-enforced-td4015086.html

http://lucene.472066.n3.nabble.com/Duplicate-Unique-Key-td4129651.html

在我的情况下,并非索引中的所有文档都是重复的,只有一些.我假设 - 最初 - 当索引中存在相同的uniqueKey时,它们会在提交时被覆盖.这似乎不像我预期的那样工作.我不想简单地更新文档中的某些字段,我想完全替换它,与所有孩子一起.

一些统计数据:索引中约有350,000个文档.主要是与childDocuments.文档由"content_type"字段区分.我使用SolrJ以这种方式导入它们:

HttpSolrServer server = new HttpSolrServer(url);
server.add(a Collection<SolrInputDocument>);
server.commit();
Run Code Online (Sandbox Code Playgroud)

我总是再次为所有孩子添加一份完整的文档.它没什么特别的花哨.我最终得到了相同uniqueKey的重复文档.没有侧面注射.我只使用集成的Jetty运行Solr.我没有在java"手动"中打开lucene索引.

我当时做的是再次删除+插入.这似乎工作了一段时间,但在某些情况下开始给出此错误消息:

父查询生成与父项筛选器不匹配的文档

发生这种情况的文档似乎是完全随机的,似乎只有一件事情出现:它是一个发生它的childDocument.我没有运行任何特殊的东西,基本上从网站上下载了solr包并运行它bin/solr start

任何想法?

编辑1

我想我发现了问题,这似乎是个错误?要重现此问题:

我在一个virtualBox中将Solr 5.3.1下载到了Debian并启动了它bin/solr start.添加了具有基本配置集的新核心.基本配置集没有任何改变,只是将其复制并添加了核心.

这导致索引中具有相同id的两个文档:

    SolrClient solrClient = new HttpSolrClient("http://192.168.56.102:8983/solr/test1");
    SolrInputDocument inputDocument = new SolrInputDocument();
    inputDocument.setField("id", "1");
    inputDocument.setField("content_type_s", "doc_unfinished");
    solrClient.add(inputDocument);
    solrClient.commit();
    solrClient.close();

    solrClient = new HttpSolrClient("http://192.168.56.102:8983/solr/test1");
    inputDocument = new SolrInputDocument();
    inputDocument.setField("id", "1");
    inputDocument.setField("content_type_s", "doc");
    SolrInputDocument childDocument = new SolrInputDocument();
    childDocument.setField("id","1-1");
    childDocument.setField("content_type_s", "subdoc");
    inputDocument.addChildDocument(childDocument);
    solrClient.add(inputDocument);
    solrClient.commit();
    solrClient.close();
Run Code Online (Sandbox Code Playgroud)

搜索:

http://192.168.56.102:8983/solr/test1/select?q= %3A&重量= JSON&缩进=真

导致以下输出:

{

  "responseHeader": {
    "status": 0,
    "QTime": 0,
    "params": {
      "q": "*:*",
      "indent": "true",
      "wt": "json",
      "_": "1450078098465"
    }
  },
  "response": {
    "numFound": 3,
    "start": 0,
    "docs": [
      {
        "id": "1",
        "content_type_s": "doc_unfinished",
        "_version_": 1520517084715417600
      },
      {
        "id": "1-1",
        "content_type_s": "subdoc"
      },
      {
        "id": "1",
        "content_type_s": "doc",
        "_version_": 1520517084838101000
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Seb*_*mer 3

感谢您的反馈意见!我将其写为答案,因为否则它太长了。我实际上从邮件列表中得到了相同的回复:

米哈伊尔·赫鲁德涅夫 你好塞巴斯蒂安,

混合独立文档和块是行不通的。还有很多问题有待解决。

2016 年 3 月 9 日星期三下午 3:02,Sebastian Riemer 写道:

你好,

简而言之,为了实际描述我的问题,我不只是链接到测试应用程序,而是使用 SolrJ 执行以下操作:

1)创建一个新文档作为父文档并提交

    SolrInputDocument parentDoc = new SolrInputDocument();
    parentDoc.addField("id", "parent_1");
    parentDoc.addField("name_s", "Sarah Connor");
    parentDoc.addField("blockJoinId", "1");
    solrClient.add(parentDoc);
    solrClient.commit();
Run Code Online (Sandbox Code Playgroud)

2) 创建一个与 1) 具有相同唯一 ID 的新文档,并附加一个子文档

    SolrInputDocument parentDocUpdateing = new SolrInputDocument();
    parentDocUpdateing.addField("id", "parent_1");
    parentDocUpdateing.addField("name_s", "Sarah Connor");
    parentDocUpdateing.addField("blockJoinId", "1");

    SolrInputDocument childDoc = new SolrInputDocument();
    childDoc.addField("id", "child_1");
    childDoc.addField("name_s", "John Connor");
    childDoc.addField("blockJoinId", "1");

    parentDocUpdateing.addChildDocument(childDoc);
    solrClient.add(parentDocUpdateing);
    solrClient.commit();
Run Code Online (Sandbox Code Playgroud)

3) 在 solr 索引中产生 2 个 id="parent_1" 的文档

这是正常行为吗?我认为应该更新现有文档而不是生成具有相同 id 的新文档。

对于完整的工作测试应用程序,请参阅原始消息。

最好的问候,塞巴斯蒂安

我认为这是一个已知问题,并且存在一些与此相关的票证,但我很高兴有一种方法可以处理它(从一开始就添加子文档)(https://issues.apache .org/jira/browse/SOLR-6096https://issues.apache.org/jira/browse/SOLR-5211,https : //issues.apache.org/jira/browse/SOLR-7606