术语查询没有给出正确的结果
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.
我的问题:
- 为什么会这样?请给出正确的解决方案!
- "term"、"match"、"match phrase"查询有什么不同。
- "keyword"、"text"、"string"有什么区别?它影响在
查询?
- 什么是日期数据类型格式,我们可以用哪种格式保存数据
类型?
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"
一起使用(或默认值)将在索引时分析文本,并可能将文档中的文本拆分为多个术语。
keyword
或 string
与 "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,即使大小写不同也会导致找不到结果。
映射
"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.
我的问题:
- 为什么会这样?请给出正确的解决方案!
- "term"、"match"、"match phrase"查询有什么不同。
- "keyword"、"text"、"string"有什么区别?它影响在 查询?
- 什么是日期数据类型格式,我们可以用哪种格式保存数据 类型?
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"
一起使用(或默认值)将在索引时分析文本,并可能将文档中的文本拆分为多个术语。
keyword
或 string
与 "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,即使大小写不同也会导致找不到结果。