【发布时间】:2014-05-11 15:21:49
【问题描述】:
我正在使用 apache solr 来匹配我的 webapp 的功能,我遇到了这种场景的问题:
我有三个程序员,技能领域是他们的技能,“权重”是指他/她的技能有多好:
{
name: "John",
skill: [
{name: "java", weight: 90},
{name: "oracle", weight: 90},
{name: "linux", weight: 70}
]
},
{
name: "Sam",
skill: [
{name: "C#", weight: 98},
{name: "java", weight: 75},
{name: "oracle", weight: 70},
{name: "tomcat", weight: 70},
]
},
{
name: "Bob",
skill: [
{name: "oracle", weight: 90},
{name: "java", weight: 85}
]
}
我正在寻找程序员的工作:
{
name: "webapp development",
skillRequired: [
{name: "java", weight: 85},
{name: "oracle", weight: 85},
]
}
我想使用工作的“skillRequired”来匹配那些程序员(找到最适合工作的人)。在这种情况下,应该是 John 和 Bob,Sam 被踢掉是因为他的 java 和 oracle 技术不够好。 John 应该比 Bob 得分更高,因为他更了解预言机。
问题是,solr 不能索引嵌套对象,我想我能得到的最好的格式是:
name: "John",
skill-name: ["java", "oracle", "linux"],
skill-weight: [90, 90, 70]
等等。所以我不知道是否可以构造一个查询来让这个场景工作。
有更好的架构结构吗?还是使用索引/查询时间提升?
我几乎阅读了所有的 solr wiki 和 google,但没有运气,欢迎任何提示和解决方法。
问题已解决,请在此处记录我的解决方案以寻求帮助:
1st,我的数据格式是json,所以我需要solr-4.8.0来支持json索引嵌套数据。如果数据是 xml 格式,solr-4.7.2 仍然可以工作。
2、solr-4.8.0需要java7-u55(官方推荐)
3,嵌套文档/对象应该使用“childDocuments”键提交给 solr。为了识别父/子文档的类型,我添加了“类型”字段。所以上面的例子看起来是这样的:
{
type: "programmer",
name: "John",
_childDocuments_: [
{type:"skill", name: "java", weight: 90},
{type:"skill", name: "oracle", weight: 90},
{type:"skill", name: "linux", weight: 70}
]
},
{
type: "programmer",
name: "Sam",
_childDocuments_: [
{type:"skill",name: "C#", weight: 98},
{type:"skill", name: "java", weight: 75},
{type:"skill", name: "oracle", weight: 70},
{type:"skill", name: "tomcat", weight: 70},
]
},
{
type: "programmer",
name: "Bob",
_childDocuments_: [
{type:"skill", name: "oracle", weight: 90},
{type:"skill", name: "java", weight: 85}
]
}
4、提交并提交到 solr 后,我可以将作业与块连接查询匹配(在过滤器查询中):
fq={!parent which='type:programmer'}type:skill AND name:java AND weight:[85 TO *]&
fq={!parent which='type:programmer'}type:skill AND name:oracle AND weight:[85 TO *]
【问题讨论】:
-
能否请您为这种特殊情况提供 schema.xml?
-
您是否必须将 _ root _ 文件添加到您的架构中?我遵循yonik.com/solr-nested-objects 的指导方针,在添加嵌套文档之前,我必须更新架构: $ curl localhost:8983/solr/nested_demo/schema -X POST -H 'Content-type:application/json' --data-binary '{ "add-field" : { "name":"_ root _", "type":"string", "indexed":true, "stored":false } }'
-
您能提供架构吗?你是如何在 schema 中声明这个字段的?
-
@PratikPatel 对不起,我很久以前就离开了那家公司,所有的知识都留在那里。也许您可以尝试弹性搜索?这似乎更受欢迎。