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)
我究竟做错了什么?
感谢您的反馈意见!我将其写为答案,因为否则它太长了。我实际上从邮件列表中得到了相同的回复:
米哈伊尔·赫鲁德涅夫 你好塞巴斯蒂安,
混合独立文档和块是行不通的。还有很多问题有待解决。
2016 年 3 月 9 日星期三下午 3:02,Sebastian Riemer 写道:
你好,
简而言之,为了实际描述我的问题,我不只是链接到测试应用程序,而是使用 SolrJ 执行以下操作:
1)创建一个新文档作为父文档并提交
Run Code Online (Sandbox Code Playgroud)SolrInputDocument parentDoc = new SolrInputDocument(); parentDoc.addField("id", "parent_1"); parentDoc.addField("name_s", "Sarah Connor"); parentDoc.addField("blockJoinId", "1"); solrClient.add(parentDoc); solrClient.commit();
2) 创建一个与 1) 具有相同唯一 ID 的新文档,并附加一个子文档
Run Code Online (Sandbox Code Playgroud)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();
3) 在 solr 索引中产生 2 个 id="parent_1" 的文档
这是正常行为吗?我认为应该更新现有文档而不是生成具有相同 id 的新文档。
对于完整的工作测试应用程序,请参阅原始消息。
最好的问候,塞巴斯蒂安
我认为这是一个已知问题,并且存在一些与此相关的票证,但我很高兴有一种方法可以处理它(从一开始就添加子文档)(https://issues.apache .org/jira/browse/SOLR-6096,https://issues.apache.org/jira/browse/SOLR-5211,https : //issues.apache.org/jira/browse/SOLR-7606)
归档时间: |
|
查看次数: |
2486 次 |
最近记录: |