对弹性搜索查询感到困惑

时间:2015-11-11 19:44:56

标签: elasticsearch

        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”字样的文档以及导致返回的原因?换句话说,搜索查询“癌症”正在发生什么其他处理。

更新

我的盒子上是否有可以清除所有索引和所有内容的命令,所以我有一个干净的石板?我运行删除/ *成功但仍然匹配。

2 个答案:

答案 0 :(得分:1)

如果您使用Sense,则测试问题是get请求。在Sense中它应该是GET(大写字母)。

说明与GETPOST 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 的文档。 ..但如果您搜索癌症,您只会找到包含癌症癌症等的文件......等等。