POST http://localhost:9200/test2/drug?pretty
{
"title": "I can do this"
}
get test2/drug/_search
{
"query" : {
"match": {
"title": "cancer"
}
}
}
映射是:
{
"test2": {
"mappings": {
"drug": {
"properties": {
"title": {
"type": "string"
}
}
}
}
}
}
运行上述查询将返回文档。我想了解弹性在幕后做什么?通过查看默认分析器的输出,它不会对癌症进行标记,使其返回“可以”,那么为什么会返回带有“can”字样的文档以及导致返回的原因?换句话说,搜索查询“癌症”正在发生什么其他处理。
我的盒子上是否有可以清除所有索引和所有内容的命令,所以我有一个干净的石板?我运行删除/ *成功但仍然匹配。
答案 0 :(得分:1)
如果您使用Sense,则测试问题是get
请求。在Sense中它应该是GET
(大写字母)。
说明与GET
与POST
http方法有关。
在场景背后,Sense实际上将GET
请求转换为HTTP POST
(给定many browsers do not support HTTP GET requests with a request body)。这意味着,即使您编写GET
,实际的http请求也是POST
。
因为Sense具有强制请求方法的大写字母的自动完成功能,所以在决定它是否{sa GET
(而不是小写get
)请求时,它使用相同的大写字母有请求正文。如果是,那么该请求将转换为POST
。如果它比较请求方法并且决定不是GET,它会按原样发送请求,这意味着使用get
方法和正文。由于正文被忽略,到达Elasticsearch的内容将是test2/drug/_search
,基本上是match_all
。
答案 1 :(得分:0)
我猜你在索引映射中配置了NGram过滤器或标记器。让我们假设(我希望你能确认我的假设)配置Edge NGram。您可以查看:
GET test2/_mapping
然后文档被标记化:i,c,ca,can,d,do,t,th,thi,this。因此,在索引中,令牌可以指向文档我可以执行此操作
当您搜索癌症时,代币c,ca,can,canc,cance,癌症由同一分析链产生,然后在索引中查找。结果就找到了你的文件。
使用NGram过滤器,您通常需要为搜索配置不同的分析器而不是索引,例如:
index_analyzer
/ analyzer
:standard + edge ngram search_analyzer
:stardand 然后,如果您搜索可以,您将找到包含 can ,癌症, candy 的文档。 ..但如果您搜索癌症,您只会找到包含癌症,癌症等的文件......等等。