我有一些看起来像这样的文件:
{
"names": [
{
"type": "Main Name",
"value": "My important title"
},
{
"type": "Subtitle",
"value": "Just my subtitle"
}
],
}
我想做的是传递一个字符串,它能够在type
Main Name
项的值中包含传递的字符串的地方进一步增强文档。例如,搜索“重要”将意味着示例文档的得分将高于搜索“仅”或“字幕”的得分。
到目前为止,我有以下子查询(较大查询的一部分):
{
"match_phrase": {
"names.value": {
"query": "important",
"slop": 100
}
}
但是我真的不知道如何区分数组中的字段。我想做类似的事情,如果type
是“ Main Name”,而value
包含“ important”,则加5。我一直在使用boost关键字。 / p>
这可能吗?
在评论之后,我能够构建以下似乎有效的查询。这是我正在使用的全部查询:
{
"nested":{
"path":"propertyNames",
"boost":1000,
"query":{
"bool":{
"must":[
{
"match":{
"propertyNames.type.raw":{
"query":"Primary Name"
}
}
},
{
"match_phrase":{
"propertyNames.value.raw":{
"query":"downing"
}
}
}
]
}
}
}
}
我要添加的部分是query.function_score.query.bool.should
中的第二个嵌套查询。 propertyNames中的数据如下所示:
{
"names": [
{
"type": "Primary Name",
"value": "10 Downing Street"
},
{
"type": "Other Name",
"value": "The prime minister's house"
}
],
}
如果搜索词“下降”,则上述文档应获得更高的分数。如果它是“素数”,则不应提高它。
但是,我添加的部分没有任何影响。
我认为这是大致正确的。我一直在玩should
和must
的很多组合,但是没有组合给出正确的结果。
我在这里正确吗?
我添加的嵌套查询是否存在都没有关系。返回相同的结果。
答案 0 :(得分:0)
这是一个带有嵌套类型的工作示例。
这里是带有嵌套类型的映射,用于跟踪名称值与其类型之间的关系。
PUT test_stack_overflow
{
"mappings": {
"document": {
"properties": {
"names": {
"type": "nested",
"properties": {
"type": {
"type": "keyword"
},
"value": {
"type": "string"
}
}
}
}
}
}
}
一些测试文件
PUT test_stack_overflow/document/1
{
"names": [
{
"type": "Primary Name",
"value": "10 downing Street"
},
{
"type": "Other Name",
"value": "The something minister's house"
}
]
}
PUT test_stack_overflow/document/2
{
"names": [
{
"type": "Primary Name",
"value": "10 something Street"
},
{
"type": "Other Name",
"value": "The downing house"
}
]
}
还有一个示例示例(有很多方法可以实现您的目标)来增强Primary Name
类型的匹配项。
我们使用一个布尔查询,该布尔查询指定我们需要在任何names.value
中查找该查询,并且匹配的文档应该在类型为names
的{{1}}中找到该值(如果满足条件,则should子句将增加得分)
Primary Name
=>返回两个分数完全相同的文件
GET test_stack_overflow/document/_search
{
"query": {
"nested": {
"path": "names",
"query": {
"bool": {
"must": [
{
"match": {
"names.value": "downing"
}
}
]
}
}
}
}
}
=>首先返回文档1
我希望它将对您有所帮助。