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

zkure5ic  于 2022-11-22  发布在  ElasticSearch
关注(0)|答案(1)|浏览(142)

假设我有一个查询子句,

{
    "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)"

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

rseugnpd

rseugnpd1#

当你使用模糊查询时,Lucene解析和构造查询的方式与正常行为不同。你看到的解释是Lucene查询是从查询文本构建的。当使用模糊查询时,大多数文本分析都不会完成,只允许基于每个字符的过滤器,你可以在文档[1] 2(https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-normalizers.html)中阅读。
在第一种情况下,由于使用了模糊性,查询文本被空格分隔。然后,为每个术语构建一个强制子句(AND运算符表示每个术语必须出现在文档中)。您可以称之为“以术语为中心”的查询。然后,使用析取(|)子句。因此,您会看到“广告必须在projectName或flowName中,并且spark(具有Levenshtein_distance内的变体)必须在projectName或flowName中”。
在第二种情况下,没有使用模糊性。2这里查询被传递到每个字段,然后术语将跟随相应的字段文本分析(如果有的话)。您可以称之为“字段中心”查询。因此,您会看到“ads spark MUST be in projectName OR flowName”以匹配文档。您实际上是从“我希望所有术语都出现在文档中”(它可能在不同的字段中)更改为“我希望所有术语出现在单个字段中”。
如果你想深入分析,你可以阅读这篇博客文章https://sease.io/2021/05/apache-solr-sow-parameter-split-on-whitespace-and-multi-field-full-text-search.html。这是相对于Solr的,但Elasticsearch应用了相同的行为。

相关问题