当前位置: 首页 > 面试题库 >

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

霍财
2023-03-14
问题内容

我在Elasticsearch中放了2个文档:

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\""
    }
  }
}'

我想elasticsearch以匹配我传递给查询参数的确切词组(带空格),该怎么做?


问题答案:

您需要查看的是正在使用的分析仪。如果您未指定,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个文档: 而这一个,只有第二个文件: 我希望弹性搜索能够匹配我传递给查询参数的确切短语,带有空格,我该怎么做?

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

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

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

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

  • 问题内容: 我在Elasticsearch中有一个带有value的字段。当我要使用查询字符串“ cgn:4189”进行搜索时,没有结果。我尝试像“ cgn:4189”那样逃脱冒号,但是我有语法错误。我不知道该怎么做。 结果: 和 结果: 你能帮我吗? 问题答案: 尝试以下查询,看看它是否适合您: 这是一些我用来测试的Sense代码: http://sense.qbox.io/gist/1c9096