【问题标题】:How can we make few tokens to be phrase in elastic search query我们如何在弹性搜索查询中使少量标记成为短语
【发布时间】:2020-06-05 15:09:02
【问题描述】:

我想搜索要被视为短语的查询的一部分。例如我想搜索“你能给我看酒店和航空业的文件吗” 在这里,我希望将 Airline Industry 视为短语。我在 multi_match 中找不到任何此类设置。 即使我们尝试使用 multi_match 查询,使用 "Can you show me documents for Hospitality 和 \"Airline Industry\"" 。默认分析器将其分解为单独的标记。我不想更改分析器的设置。而且我发现我们可以在 simple_query_string 中执行此操作,但这会导致我们无法像在 multi_match 布尔查询中那样应用过滤器选项,因为我也想在某些字段上应用过滤器。

search_text="Can you show me documents for Hospitality and Airline Industry" 现在我想将 Airline Industry 作为短语传递,以针对 2 个字段搜索我的索引文档。 好吧,假设我有这样的现有代码。

If filter:
qry={
    “query":{
        “bool”:{
            “must”:{
                "multi_match":{
                "query":search_text,
                "type":"best_fields",
                "fields":["TITLE1","TEXT"],
                "tie_breaker":0.3,
                }
            },
            “filter”:{“terms”:{“GRP_CD”:[“1234”,”5678”]     }
    }
    }

else:
qry={

    "query":{
        "multi_match":{
        "query":search_text',
        "type":"best_fields",
        "fields":["TITLE1",TEXT"],
        "tie_breaker":0.3
        }
    }
}

'但后来我意识到即使我传递这样的搜索字符串,这段代码也没有将航空业作为一个短语处理 "你能给我看看酒店业和\"航空业\"的文件吗?"

根据弹性搜索文档,我知道有这个查询可以处理这个问题

qry={"query":{
"simple_query_string":{
"query":"Can you show me documents for Hospitality and \"Airline Industry\"",
"fields":["TITLE1","TEXT"] }
} }

但现在我的问题是,如果用户想要应用过滤器.. 使用上面的过滤器查询,我无法通过 simple_query_string' 传递短语和布尔查询

【问题讨论】:

  • simple_query_string 是正确的选择之一,但如果使用simple_query_string,您将无法应用哪些过滤器。你能用例如解释一下吗
  • @OpsterESNinjaNishant 已更新代码

标签: elasticsearch token phrase booleanquery elasticsearch-analyzers


【解决方案1】:

您始终可以使用boolean query 组合查询。让我们逐案理解。在讨论这些案例之前,我想澄清一件关于过滤器的事情。布尔查询的过滤子句的行为就像一个必须子句,但不同之处在于过滤子句中的任何查询(甚至是另一个带有必须/应该子句的布尔查询)都具有过滤上下文。过滤上下文意味着,查询的那部分将不被考虑用于分数计算。

现在让我们继续讨论案例:

案例一:只有查询,没有过滤器。

{
  "query": {
    "bool": {
      "must": [
        {
          "simple_query_string": {
            "query": "Can you show me documents for Hospitality and \"Airline Industry\"",
            "fields": [
              "TITLE1",
              "TEXT"
            ]
          }
        }
      ]
    }
  }
}

请注意,查询与您在问题中指定的相同。我在这里所做的只是将它包装在一个布尔查询中。这不会对查询进行任何逻辑更改,但这样做可以更轻松地以编程方式将查询添加到过滤子句。

案例 2:带过滤器的短语查询。

{
  "query": {
    "bool": {
      "must": [
        {
          "simple_query_string": {
            "query": "Can you show me documents for Hospitality and \"Airline Industry\"",
            "fields": [
              "TITLE1",
              "TEXT"
            ]
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "GRP_CD": [
              "1234",
              "5678"
            ]
          }
        }
      ]
    }
  }
}

这样您可以将查询(查询上下文)与过滤器结合起来。

【讨论】:

  • 非常感谢您的回复。我会尝试您提供的这些查询。顺便说一句,您是否也同意 multi_match 不能处理部分短语正确并且 simple_query_string 是唯一的选择?对不起,但我是新手弹性搜索。
  • 您可以进行完整的词组搜索,但不能进行部分搜索。例如搜索字符串时 quick brown fox 您可以将整个字符串作为短语进行搜索,但如果您只希望 brown fox 将完整字符串作为短语进行搜索,并像正常查询一样休息字符串然后不能使用单个 multi_match 查询来完成。
猜你喜欢
  • 2021-08-06
  • 1970-01-01
  • 2017-11-09
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多