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

如何在Elasticsearch中对相同字段进行精确值匹配查询?

云霖
2023-03-14
问题内容

所以我有一个字段以以下格式存储值:number/year,例如23 / 2014、24 / 2014、12 / 2015等。

因此,如果将此字段映射为not_analyzed一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 /
2014等),则可以正常工作,例如sql equals(=)

{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "processNumber": "11/2014"
        }
      }
    }
  }
}

因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。

但是,如果将字段定义为not_analyzed,则无法sql LIKE使用match_phrase查询进行类型搜索。

{
  "query": {
    "match_phrase": {
      "processNumber": "11/201"
    }
  }
}

在这种情况下,搜索11,11 /,/
2014或2014应该返回匹配,但不会返回。问题是,如果该字段未映射为一个,则此查询有效not_analyzed。因此,似乎我必须使用其中之一,问题是该字段应支持两个选项以用于不同的查询,我在这里遗漏了什么吗?


问题答案:

您可以使用映射中的fields属性以不同的方式
分析同一字段 processNumber

例如,如果要使用ProcessNumber的经过分析和未经分析的版本,则映射为:

 {
   "type_name": {
      "properties": {
         "processNumber": {
            "type": "string",
            "index": "not_analyzed",
            "fields": {
               "analyzed": {
                  "type": "string",
                  "index": "analyzed"
               }
            }
         }
      }
   }
}

在查询中将未分析的字段称为 processNumber

要引用该字段的分析视图,请使用 processNumber.analyzed

查询术语11 / 201、11等将是:

示例过滤器:

 { "query" : { "filtered" : { "filter" : { "term" : { "processNumber" : "11/2014" } } } } }

术语过滤器不分析搜索字符串,因此在这种情况下,输入将与字段倒排索引匹配:11/2014针对该字段。

示例Match_Phrase_prefix:

{ "query": { "match_phrase_prefix": { "processNumber": "11/201" } } }

match_phrase_prefix尝试检查短语中的最后一项是否为index中各项的前缀。如果指定了分析器,它将分析搜索字符串。这就是您需要在此处使用该字段的未
分析 版本的原因。如果我们使用 processNumber.analyzed 搜索查询,例如 11-201,11 | 201 也将匹配

匹配示例:

  { "query": { "match": { "processNumber.analyzed": "11" } } }

这是直接匹配,因为默认分析器(通常是标准分析器)会将11/2014标记为2014年11月。

您可以使用分析api来查看默认分析器如何分析特定文本。

curl -XPOST "http://<machine>/_analyze?text=11/2014"


 类似资料:
  • 问题内容: 有没有办法让ElasticSearch在分析的字段上识别完全匹配?理想情况下,我想小写,标记化,词干化,甚至对我的文档进行语音化,然后让查询提取“精确”匹配项。 我的意思是,如果我索引“汉堡包”和“汉堡包”,它们将被分析为[“汉堡包”,“小圆面包”]和[“汉堡包”]。如果我搜索“汉堡”,它将仅返回“汉堡”文档,因为这是“完全匹配”。 我尝试使用关键字标记器,但不会阻止各个标记。我是否需

  • 问题内容: 我想在一个字段中搜索“ vision”项目,但是通过在DSL中使用match / match_phrace / term,我只得到了“ vision A”,“ vision B”,“ xx版本”,“ vision”等结果。 我想要的是精确匹配“视觉”应该获得最高分,而包含“视觉”的项目应该排在精确匹配之后。排名应该是: 我检查了Elasticsearch匹配精确术语其中识别出将“索引”

  • 问题内容: 我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“ google”。 我有: 但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”? 问题答案: 关键是您使用的ElasticSearch正则表达式需要 完整的字符串匹配 : Lucene的模式总是锚定的

  • 在elasticsearch中,假设我有如下文档 有一个用例,如果我在搜索栏中键入“Bio”,我应该从elasticsearch中获得匹配的字段值和字段名。 对于本例, 输入:“生物” 预期产出: 我应该使用什么类型的查询?我可以想到使用NGram标记器,然后使用匹配查询。但是,我不确定如何只获得匹配的字段值(而不是整个文档)和相应的字段名作为输出。

  • 问题内容: 这个问题是基于之前的帖子,其中“” 或“”都无法进行“精确搜索” 。 然后,我在这里找到了类似的帖子,其中在映射定义中将搜索字段设置为not_analyzed(通过@Russ Cam)。 但是我正在使用 可能是因为该原因该解决方案无法正常工作。 因为如果我通过“ SOME”,它将与“SOME”和“SOMEOTHERLOAN”相匹配,但情况并非如此(在我先前的文章中为“ productv

  • 我试图检查字符串是否包含完全匹配。例如: String str="这是我的字符串,具有-Policy和-p" 我怎样才能做到以下几点: