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

如何在ElasticSearch中query_string搜索精确的短语

盖弘毅
2023-03-14

我在Elasticsearch中放置了两个文档:

curl -XPUT "http://localhost:9200/vehicles/vehicle/1" -d'
{
    "model": "Classe A"
}'

curl -XPUT "http://localhost:9200/vehicles/vehicle/2" -d'
{
    "model": "Classe B"
}'

为什么此查询返回2个文档:

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe A\""
    }
  }
}'

而这一个,只有第二个文件:

curl -XPOST "http://localhost:9200/vehicles/_search" -d'
{
  "query": {
    "query_string": {
      "query": "model:\"Classe B\""
    }
  }
}'

我希望弹性搜索能够匹配我传递给查询参数的确切短语,带有空格,我该怎么做?

共有3个答案

空夕
2023-03-14

使用匹配短语查询,如下所述

GET /company/employee/_search   
{     
    "query" : {      
        "match_phrase" : {      
            "about" : "rock climbing"      
        }      
    }      
}
常业
2023-03-14

此外,您可以使用query_string和转义引号也将返回一个确切的短语:

POST _search
{
    "query": {
      "query_string": {
        "query": "\"Classe A\""
     }
}
扶开诚
2023-03-14

你需要看的是你正在使用的分析仪。如果不指定一个Elasticsearch,将使用标准分析器。它适用于大多数纯文本输入的情况,但不适用于您提到的用例。

标准分析器将要做的是拆分字符串中的单词,然后将它们转换为小写。

如果您想匹配整个字符串“Classe A”并将其与“Classe B”区分开来,可以使用关键字分析器。这将使整个字段保持为一个字符串。

然后您可以使用匹配查询,它将返回您期望的结果。

创建映射:

PUT vehicles
{
  "mappings": {
    "vehicle": {
      "properties": {
        "model": {
          "type": "string",
          "analyzer": "keyword"
        }
      }
    }
  }
}

执行查询:

POST vehicles/_search
{
  "query": {
    "match": {
      "model": "Classe A"
    }
  }
}

如果您想使用query_string查询,那么您可以将运算符设置为AND

POST vehicles/vehicle/_search
{
  "query": {
    "query_string": {
      "query": "Classe B",
      "default_operator": "AND"
    }
  }
}
 类似资料:
  • 问题内容: 我在Elasticsearch中放了2个文档: 为什么此查询返回2个文档: 而这个,只有第二个文件: 我想elasticsearch以匹配我传递给查询参数的确切词组(带空格),该怎么做? 问题答案: 您需要查看的是正在使用的分析仪。如果您未指定,Elasticsearch将使用标准分析器。在大多数使用纯文本输入的情况下,它非常有用,但不适用于您提到的用例。 标准分析器将执行的操作是将字

  • 我现在从Elasticsearch开始。我为一些EDIFACT消息(一种史前数据格式;-)编制了索引,内容如下: 当我搜索短语UNH 66304 CODECO: D:95B时,它应该只返回一次命中,但它似乎返回了包含任何这些单词的所有文件(并且UNH在每个文档中)。我的查询是: 我尝试添加“and”操作符,如下所示: 但是没有返回结果。我在这里读到了建议:搜索需要使用双引号的确切短语。我试过“查询

  • 问题内容: 我想在文档中搜索“社交网络营销”。全部一起。但是我继续得到结果,单词分开。我有以下DSL查询: 我没有包含此短语和标题的文档,但是我也得到了包含短语单词的搜索结果(文档)以进行拆分。我要严格搜索。如果没有任何文档使用此短语,则不要检索任何文档或仅检索具有该标题的文档。为什么 运算符又 不起作用? 问题答案: 您可以使用类型词组尝试以下方法吗?看到这里说, 查询首先分析查询字符串以生成术

  • 问题内容: Elasticsearch版本:7.1.1 嗨,我做了很多尝试,但是在索引中找不到任何解决方案,我有一个包含字符串的字段。 因此,例如,我有两个文档,它们在locations数组中包含不同的值。 文件1: 文件2: 用户请求搜索术语 克洛彭堡, 而我只想返回那些包含术语 克洛彭堡 而不是 Landkreis Cloppenburg的 文档。结果应仅包含 Document-1 。但是我的

  • 问题内容: 我正在寻找一种在elasticsearch中进行 精确 数组匹配的方法。假设这些是我的文件: 有没有一种方法可以搜索所有类别 完全相同或完全不同 的“ c”和“ d”文档(文档1和5)? 另外,搜索“其中一个”类别还是应该可行的(例如,您可以搜索“ c”并获得1、2、3和5) 有解决这个问题的聪明方法吗? 问题答案: 如果您有一组离散的已知类别,则可以使用布尔查询: 否则,我认为,可能

  • 这是mysql查询。如何在ElasticSearch中编写此查询?我使用的是elasticsearch版本0.90.7。