在使用query_string子句的模糊运算符时使用哪个分析器?



假设我有一个这样的查询子句,

{
"query":
{
"query_string": {
"query": "ads spark~",
"fields": [
"flowName",
"projectName"
],
"default_operator": "and"
}
}
}

对于这个解释输出是:

"explanation": "+(projectName:ads | flowName:ads) +(projectName:spark~1 | flowName:spark~1)"

然而,如果我从查询中删除模糊运算符。更新了下面的查询子句,

{
"query":
{
"query_string": {
"query": "ads spark",
"fields": [
"flowName",
"projectName"
],
"default_operator": "and"
}
}
}

我得到一个不同的解释输出,

"explanation": "(projectName:ads spark | flowName:ads spark)"

知道为什么在这两种情况下生成的令牌不同吗?

当您使用模糊查询时,查询在Lucene中解析和构造的方式与正常行为不同。您看到的解释是由查询文本构建的Lucene查询。当使用模糊时,大多数文本分析都没有完成,只允许在每个字符的基础上工作的过滤器,正如您可以在文档[1][2]中阅读的那样。

在第一种情况下,由于您使用的是模糊性,查询文本被空格分割。然后,为每个术语构建一个强制子句(AND操作符声明每个术语必须出现在文档中)。你可以把这叫做"中心"查询然后使用析取子句在输入中的多个字段中搜索每个词。因此,你看到广告必须在projectName或flowName,和火花(在Levenshtein_distance的变化)必须在projectName或flowName。

在第二种情况下,没有使用模糊性。在这里,查询被传递到每个字段,然后术语将遵循相应的字段文本分析(如果有的话)。您可以将其称为"场向中心"。查询因此,广告火花必须在projectName或flowName"有一个文档匹配。你实际上是从"我希望所有的术语都出现在文档中";(可以在不同的字段中)到"我希望所有的术语都出现在一个字段中"。

如果你想要一个深入的分析,你可以阅读这篇博客文章https://sease.io/2021/05/apache-solr-sow-parameter-split-on-whitespace-and-multi-field-full-text-search.html。这是相对于Solr,但Elasticsearch应用相同的行为。

最新更新