当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:匹配查询如何工作?

翟学文
2023-03-14

我是Elasticsearch新手,对匹配查询的工作方式感到困惑。我有以下映射:

{
    "product": {
        "properties": {
            "condition" : { "type" : "string", "store" : "yes", "index": "analyzed"}
        }
    }
}

我批量导入了以下文档

{ "index": {"_index": "myindex", "_type": "product", "_id": "1"}}
{ "condition": "All Quiet on the Western Front"}
{ "index": {"_index": "myindex", "_type": "product", "_id": "2"}}
{ "condition": "All Quieter on the Western Front"}
{ "index": {"_index": "myindex", "_type": "product", "_id": "3"}}
{ "condition": "All Quietest on the Western Frontline"}

我验证了所有文档都已成功加载。然后我执行匹配查询:

{
    "query" : {
        "match" : {
            "condition" : "quiet"
        }
    }
}

它只返回#1文档。我在这里感到困惑。为什么它不返回所有三个文档?我应该使用什么查询来返回这三个文档,因为它们在字段中都有“quiet”根单词?

谢谢和问候。

共有1个答案

周弘盛
2023-03-14

您的问题是,您在Elasticsearch中使用的默认分析器没有词干(例如,将单词分解为词干,如“quiet”来自“quieter”或“quietest”)。

如果您想阻止,那么最简单的方法就是使用雪球分析器。请注意,您需要将此分析器用于索引和查询,否则您将无法匹配词干。

雪球分析仪

一种雪球型分析仪,使用标准标记器,带有标准过滤器、小写过滤器、停止过滤器和雪球过滤器。

Snowball Analyzer是Lucene的词干分析器,它最初基于Snowball的Snowball项目。塔塔鲁斯。组织。

示例用法:

{
    "index" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "type" : "snowball",
                    "language" : "English"
                }
            }
        }
    }
}

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-snowball-analyzer.html

 类似资料:
  • 问题内容: 这是一个分为两个部分的问题。 我的文档如下所示: 我的第一个问题是如何检索“ title” 恰好是 “ No Title”的所有文档。我不希望出现标题为“此文档没有标题”的文档。 我的第二个问题是如何检索“ URL” 恰好 出现在一长串URL中的所有文档。 我正在使用pyelasticsearch,但是在curl中使用通用答案也可以。 问题答案: 如果您存储了源代码(这是默认设置),则

  • 问题内容: 我想查询的数据是和是。编写常用的SQL很容易: 但是,对Elasticsearch进行查询对我来说并不容易。 首先,我查询了: 结果是我所期望的。 然后,我查询了: 它也运作良好。 但是我无法使用和操作将2个条件连接在一起的查询。如何将这两个匹配查询合并为一个使用和操作? 问题答案: 您需要的是布尔查询,您可以在其中输入所有单个查询: (我无法测试查询,这可能是错误的,但是bool-q

  • 问题内容: 我正在用查询查询我的elasticsearch索引。查询本身的结构与此类似 我希望能够确定所有这些查询中哪一个是与结果匹配的查询。是否有内置的elasticsearch方法允许这样做,还是我必须手动进行? 问题答案: 您可以使用命名查询,然后在结果中获得匹配的查询的名称。 然后,在结果中,您将获得一个数组,其中包含与文档匹配的查询的名称。

  • 问题内容: 我有以下 匹配 查询字符串: 我想它的意思是,但实际上它能执行。 然后我尝试了 术语 查询字符串: 它执行,显示 术语 查询通过数组支持多个OR条件。 我很好奇为什么 匹配 查询不支持通过数组的 OR 条件?并且它不显示任何语法错误。 问题答案: 该查询仅支持要指定的单个字符串值。官方文档中没有明确指定它,但是如果您愿意阅读的源代码,则可以看到,在解析字段时,解析器将跳过标记来分隔数组

  • 假设我的索引有两个文档: “Foo Bar” “Bar Foo” 当我对“bar foo”进行常规匹配查询时,两个文档都正确匹配,但它们获得了相等的相关性分数。然而,我希望单词的顺序在评分时是有意义的。换句话说,我希望“Bar Foo”有更高的分数。 因此,我尝试将match查询放在bool查询的must子句中,并包含一个match_prach(具有相同的查询字符串)作为shoul子句。在我使用“

  • 问题内容: 我必须找到具有字符串的匹配文档,例如:在某些“键”范围内的字符串:“ sky”。当我编写单独的匹配和范围查询时,我从ES中获得了输出,但是合并在一起时会抛出异常。 范围查询: 匹配查询: 组合查询: 组合查询在执行时会引发错误: 引发HTTP_EXCEPTIONS.get(状态码,TransportError)(状态码,error_message,Additional_info)ela