Elasticsearch多个前缀关键字

时间:2016-07-05 19:22:22

标签: elasticsearch

我需要使用prefix过滤器,但允许多个不同的前缀,即

{"prefix": {"myColumn": ["This", "orThis", "orEvenThis"]}}

这不起作用。如果我将每个添加为单独的prefix也显然不起作用。

非常感谢帮助。

更新

我试过should,但没有运气:

$this->dsl['body']['query']['bool']['should'] = [
    ["prefix" => ["myColumn" =>  "This"]],
    ["prefix" => ["myColumn" =>  "orThis"]]
];

当我添加这两个约束时,我得到所有响应(好像过滤器不起作用)。但是,如果我将must与其中任何一个条款一起使用,那么我的确会以正确的前缀获得回复。

1 个答案:

答案 0 :(得分:3)

根据您的评论,听起来它可能只是语法问题。对于所有ES查询(就像SQL查询一样),我建议开始简单,只需将它们作为代码之外的原始DSL提交给ES(尽管在您的情况下这不容易实现)。对于请求,这是一个非常直接的请求:

{
  "query" : {
    "bool" : {
      "must" : [ ... ],
      "filter" : [
        {
          "bool" : {
            "should" : [
              {
                "prefix" : {
                  "myColumn" : "This"
                }
              },
              {
                "prefix" : {
                  "myColumn" : "orThis"
                }
              },
              {
                "prefix" : {
                  "myColumn" : "orEvenThis"
                }
              }
            ]
          }
        }
      ]
    }
  }
}

我将其添加为filter,因为前缀的可选性质并未提高相关性:它确实要求其中一个必须匹配。在这种情况下,问题是“这匹配吗?是/否”,那么你应该使用一个过滤器(额外的奖励可以缓存!)。如果你问“这匹配,哪个匹配更好?”然后你想要一个查询(因为那是相关性 /得分)。

注意:最初的问题似乎是未提及bool / must,建议只使用bool / should

{
  "bool" : {
    "should" : [
      {
        "prefix" : {
          "myColumn" : "This"
        }
      },
      {
        "prefix" : {
          "myColumn" : "orThis"
        }
      },
      {
        "prefix" : {
          "myColumn" : "orEvenThis"
        }
      }
    ]
  }
}

的行为与

不同
{
  "bool" : {
    "must" : [ ... ],
    "should" : [
      {
        "prefix" : {
          "myColumn" : "This"
        }
      },
      {
        "prefix" : {
          "myColumn" : "orThis"
        }
      },
      {
        "prefix" : {
          "myColumn" : "orEvenThis"
        }
      }
    ]
  }
}

因为must会影响should的必要性质。 没有 mustshould的行为类似于布尔OR。但是,对于must,它表现为完全可选功能,以提高相关性(得分)。要使其返回布尔OR行为 must,您必须将minimum_should_match添加到bool复合查询。

{
  "bool" : {
    "must" : [ ... ],
    "should" : [
      {
        "prefix" : {
          "myColumn" : "This"
        }
      },
      {
        "prefix" : {
          "myColumn" : "orThis"
        }
      },
      {
        "prefix" : {
          "myColumn" : "orEvenThis"
        }
      }
    ],
    "minimum_should_match" : 1
  }
}

请注意,它是bool查询的一个组成部分,而不是shouldmust