映射
"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"}
}
}
这也不会给出任何回应。
我的问题:
TIA。
答案 0 :(得分:2)
在elasticsearch文档中反转索引。对于反向索引,我们需要正确地拆分字符串。为此我们在elasticsearch中有分析器。因此,默认情况下,在编制索引时,它会拆分" john scena"进入"约翰"和" scena"他们将指向同一份文件。所以你试图索引" john scena",但它被索引为" john"," scena"。您可以通过创建自定义分析器来更改分析器的行为。
现在每个索引都有搜索分析器,它说明了如何在搜索时分析搜索词。默认情况下,它与索引时间分析器具有相同的值。当我们进行术语查询时,它表示不会分析我的搜索词。虽然匹配说在搜索之前分析我。当你索引" john scena"时,它被索引为" john"," scena"。你正试图用" john scena"进行术语查询,它将不匹配。因为术语查询会阻止ES分析" john scena",所以它会查找完全匹配。但索引的值是" john"," scena"。所以你不会得到任何匹配。如果是匹配查询,您的搜索字词也会分成" john"和" scena"你得到了点击率。有关更多详细信息,请参阅文档,它有很好的示例。
从ES 5开始,默认情况下我们有关键字字段具有确切的值。如果您确切知道要搜索的内容,则可以使用术语查询。但要小心,因为确切的意思是确切的,即使案例差异也会导致没有找到命中。
答案 1 :(得分:1)
lName
必须属于keyword
类型才能使term
查询匹配。如果它是text
,则会对其进行分析,从而分成多个术语。
term
查询将完全与您提供的文字相匹配。
解决方案是将映射更改为:
"lName" : {
"type" : "text"
}
“term”,“match”,“match phrase”查询之间有何不同。
这些之间最大的区别是term
没有分析作为搜索文本收到的文本,而另外两个会分析。
“关键字”,“文字”,“字符串”之间有什么不同?它会影响查询吗?
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