术语查询没有给出正确的结果

Term Query Doesn't give Proper Result

映射

      "isValid" : {
        "type" : "boolean"
      },
      "lName" : {
        "type" : "text"
      },
      "mname" : {
        "type" : "keyword"
      }

数据

          "isValid" : true
          "lName" : "John scena",
          "mname" : "prod"

查询(匹配)

{
    "query": {
        "match" : {
            "lName" : "John scena"
        }
    }
}

It gives me no result but,

   {
        "query": {
            "match" : {
                "mname" : "prod"
            }
        }
    }

this gives me proper result

查询(术语)

{
   "query":{
      "term":{"lName":"John scena"}
   }
}

This will also not give any response.

我的问题:

  1. 为什么会这样?请给出正确的解决方案!
  2. "term"、"match"、"match phrase"查询有什么不同。
  3. "keyword"、"text"、"string"有什么区别?它影响在 查询?
  4. 什么是日期数据类型格式,我们可以用哪种格式保存数据 类型?

TIA。

lName 必须是 keyword 类型才能匹配您的 term 查询。如果它是您所拥有的 text,它将被分析并因此被分成多个术语。

并且 term 查询将完全匹配 您提供给它的文本。

解决方案是将映射更改为:

  "lName" : {
    "type" : "text"
  }

What is different between "term", "match", "match phrase" query.

它们之间最大的区别是 term 不分析接收到的作为搜索文本的文本,而其他两个会。

What is different between "keyword","text","string"? It affect in query?

text 以及 string"index": "analyzed" 一起使用(或默认值)将在索引时分析文本,并可能将文档中的文本拆分为多个术语。 keywordstring"index":"not_analyzed" 选项将不会在索引时触及文本,并且对于单个文档,只有一个术语会为该值编制索引。

您提出的问题都是基本问题,文档非常擅长涵盖这些问题。我强烈建议查看有关这些的文档: https://www.elastic.co/guide/en/elasticsearch/guide/master/term-vs-full-text.html https://www.elastic.co/guide/en/elasticsearch/reference/5.4/text.html https://www.elastic.co/guide/en/elasticsearch/reference/5.4/keyword.html https://www.elastic.co/guide/en/elasticsearch/guide/master/match-query.html

在 elasticsearch 中,文档是反向索引的。对于反向索引,我们需要正确地拆分字符串。为此,我们在 elasticsearch 中有分析器。所以默认情况下,在索引时它将 "john scena" 拆分为 "john" 和 "scena" 并且它们将指向同一个文档。所以你试图索引 "john scena",但它被索引为 "john"、"scena"。您可以通过创建自定义分析器来更改分析器的行为。

现在每个索引也有搜索分析器,它说明在搜索时应该如何分析搜索词。默认情况下,它与索引时间分析器具有相同的值。当我们进行词条查询时,它说不要分析我的搜索词。虽然比赛说在搜索之前分析我。当您索引 "john scena" 时,它会被索引为 "john"、"scena"。 Ans 您正在尝试使用 "john scena" 进行术语查询,它不会匹配。因为 term query 阻止 ES 分析 "john scena",所以它寻找完全匹配。但是索引的值是 "john"、"scena"。所以你不会得到任何匹配。在匹配查询的情况下,您的搜索词也被分成 "john" 和 "scena" 并且您得到匹配。有关详细信息,请参阅文档,它有很好的示例。

从 ES 5 开始,我们的关键字字段默认具有精确值。如果您确切知道要搜索的内容,则可以使用术语查询。但是要小心,exact就是exact,即使大小写不同也会导致找不到结果。