2017-05-05 45 views
1

映射期限查询没有提供正确的结果

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

数据

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

查询(匹配)

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

这让我没有结果,但是,

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

这给了我正确的结果

查询(期限)

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

这也将不给予任何回应。

我的问题:

  1. 为什么会发生?请给出适当的解决方案!
  2. “术语”,“匹配”,“匹配短语”查询有什么不同。
  3. “关键字”,“文本”,“字符串”有什么不同?它影响 查询?
  4. 什么是日期数据格式和我们可以在 类型中保存数据的格式?

TIA。

+0

@Val请尽可能帮助我并给出答案! –

+0

你的'term'查询在哪里?我们只能看到匹配查询。你还可以分享术语查询吗? – avr

+0

@avr我忘了在这里提到,我有编辑que。 –

回答

2

在elasticsearch文档反转索引。对于反向索引,我们需要正确分割字符串。为此,我们在elasticsearch中有分析器。因此,在编制索引时,默认情况下它会将“john scena”分成“john”和“scena”,它们将指向同一个文档。所以你试图索引“john scena”,但它被索引为“john”,“scena”。您可以通过创建自定义分析仪来更改分析仪的行为。

现在每个索引也有搜索分析器,它说明搜索时应该如何分析搜索词。默认情况下,它与索引时间分析器具有相同的值。当我们进行词条查询时,它表示不要分析我的搜索词。虽然比赛说,搜索前分析我。正如你已经索引了“约翰塞纳”,它被索引为“约翰”,“scena”。答案你试图用“john scena”做词条查询,它不会匹配。因为术语查询会阻止ES分析“john scena”,所以它会查找完全匹配。但被索引的值是“约翰”,“瑟纳”。所以你不会得到任何匹配。在匹配查询的情况下,您的搜索字词也会被分成“john”和“scena”,您会得到匹配结果。有关更多详细信息,请参阅文档,它有很好的例子。

从ES 5我们有默认情况下的关键字字段具有确切的价值。如果你确切知道你在搜索什么,你可以使用术语查询。但要小心,因为确切的意思是确切的,即使是这种情况的差异也会导致找不到匹配。

+0

谢谢@krrish –

+0

@DivyeshGausvami :) – krrish

1

lName需要为keyword为您的term查询匹配。如果它是text,那么它将被分析,并因此被分成多个项目。

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

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

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

什么是“术语”,“匹配”,“匹配短语”查询不同。

这些之间最大的区别在于term没有分析收到的文本作为搜索文本,而其他两个会。

“keyword”,“text”,“string”有什么不同?它影响查询?

text以及与"index": "analyzed"(或默认)中使用string将分析在索引时间的文本,并且将所述文档中的文本潜在分割成多个条款。 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

+0

我知道术语查询将完全匹配,但为什么它不会发生在我的情况? –

+0

因为,正如我在我的回复中所说的那样,“lName”必须是“关键字”而不是“文本”,就像您在映射中所使用的那样。 –

+0

但是为什么?看到我的问题,因为我在我的问题结束时提到它。 –