假设我有一个查询子句,
{
"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)"
知道为什么在两种情况下生成的令牌不同吗?
1条答案
按热度按时间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应用了相同的行为。