如果字段中的数组包含与字符串匹配的某个对象,则增强

时间:2018-11-06 09:17:20

标签: elasticsearch

我有一些看起来像这样的文件:

{
   "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"
      }
   ],
}

如果搜索词“下降”,则上述文档应获得更高的分数。如果它是“素数”,则不应提高它。

但是,我添加的部分没有任何影响。

我认为这是大致正确的。我一直在玩shouldmust的很多组合,但是没有组合给出正确的结果。

我在这里正确吗?

我添加的嵌套查询是否存在都没有关系。返回相同的结果。

1 个答案:

答案 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

我希望它将对您有所帮助。