【问题标题】:What is the correct way to apply a sub filter to a term in Elastic search?将子过滤器应用于弹性搜索中的术语的正确方法是什么?
【发布时间】:2019-12-15 15:15:16
【问题描述】:

我有一个查询,我正在尝试通过 Elastic Search 6.4.2 获取结果。

它正在工作。但是当我应用应该在 NewsArticle 类型下的标签部分时,它会返回 CaseStudyPage 类型的结果。

我这样做对吗?

基本上我想对 NewsArticle 类型的子过滤标签,但它似乎不能正常工作。

我尝试了许多不同的格式,我在 StackOverflow 和各种网页上找到了这些格式。

   "highlight":{  
      "pre_tags":[  
         ""
      ],
      "post_tags":[  
         "<\/strong>"
      ],
      "fields":{  
         "*":{  

         }
      },
      "require_field_match":false,
      "fragment_size":100,
      "number_of_fragments":3,
      "highlight_query":{  
         "query_string":{  
            "query":"",
            "analyze_wildcard":true,
            "default_operator":"AND"
         }
      }
   },
   "sort":[{"PublishedDate":"desc"}],
   "size":5000,
   "query":{  
      "bool":{  
         "filter":{  
            "bool":{  
               "should":[
                  {
                     "terms":{  
                        "ClassName":[  
                           "CaseStudyPage"
                        ]
                     }

                  },
                  {
                     "bool":{ 
                        "must": [
                           {
                              "terms":{  
                                 "ClassName":[
                                    "NewsArticle"
                                 ]
                              }
                           },
                           {
                              "terms":{  
                                 "Tags.ID":[
                                    "9"
                                 ]
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         }
      }
   }
}

没有错误消息。它带回了 Tag.ID = 9 的 CaseStudyPage 和 NewsArticle 的结果。但它应该只带回只有 Tag.ID = 9 的 CaseStudyPage(完整结果)和 NewsArticle 结果。

结果返回来自 CaseStudyPage 类型和 NewsArticle 类型的标记内容,但它应该只显示来自 NewsArticle 类型和所有 CaseStudyPage 类型的标记内容。

【问题讨论】:

  • 你能更新最后一部分吗?在“没有错误消息”之后。没看懂

标签: php json elasticsearch


【解决方案1】:

首先,出于调试目的,我会删除“突出显示”部分以及“排序”(我不确定如果排序字段 - 在您的情况下为“PublishedDate”,文档是否会被过滤掉空的?可能不是)

现在,关注查询本身;看来您的问题(如果我没有正确解决)是“标签过滤器术语查询”不起作用,因为您在结果中收到了所有 CaseStudyPage 和 NewsArticle,即使对于那些您想要特别是带有标签的最后一个也很难.ID = 9(对吗?)。

我相信您的 Tags.ID 是整数类型,对吗?如果是,请删除 9 周围的引号(如果您在索引之前没有创建映射,指定您的 Tags.ID 确实是“int”类型,那么elasticsearch 根据您的第一次插入为该字段创建了类型映射,请验证您的 Tags.ID 是“未分析的字符串 - 关键字”还是整数;这是过滤查询和术语查询正常工作所必需的)。

另一种可能是“className”字段包含多个值?例如 CaseStudyPage 和 NewsArticle 都像一个数组?如果是这样的话;那么您的 should 块将在当前的“NewsArticle”或 TAGS.ID 值上独立选择所有包含“CaseStudyPage”的文档。但这不太可能。

我会创建一个小的过滤器查询,我只会测试您是否正确过滤了 Tags.ID = 9; 的文档;在你完成这项工作之后,你可以再次将该过滤器放在必须块中。其余的部分 您的查询看起来不错。

编辑:顺便说一句,如果对于“CaseStudyPage”过滤器,您明确需要未标记的条目,那么您还需要为此添加一个“不得”块,或者必须使用!=

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多