Elasticsearch没有返回所有相关结果

时间:2013-09-08 22:45:29

标签: mongodb lucene elasticsearch search-engine

我正在使用弹性搜索来搜索存储在MongoDB中的文件。我想检索名称与模式匹配的所有文件。当我在MongoDB中查询时,它返回6754个文件。

FSsearch:PRIMARY> db.fs.files.find({"filename":/.*Mail.*/}).count();

6754

但是当我尝试使用弹性搜索时,它只返回85个文件。有什么方法可以在弹性搜索中获取所有文件吗?

curl -XGET "localhost:9200/submission_idx/files/_search?search_type=scan&scroll=10m&size=7000&pretty=1" -d '{"query" : {
"field" : {
        "filename" : "*Mail*"
    }                           
}                            
}'

{
  "_scroll_id" : "c2Nhbjs1OzIyMDpDV21tamdEbVEyZUhOcVcwYWVnVU9ROzIxODpDV21tamdEbVEyZUhOcVcwYWVnVU9ROzIxNjpDV21tamdEbVEyZUhOcVcwYWVnVU9ROzIxOTpDV21tamdEbVEyZUhOcVcwYWVnVU9ROzIxNzpDV21tamdEbVEyZUhOcVcwYWVnVU9ROzE7dG90YWxfaGl0czo4NTs=",
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 85,
    "max_score" : 0.0,
    "hits" : [ ]
  }
}

1 个答案:

答案 0 :(得分:0)

您可以使用Regexp Filter(或Regexp Query):

{
    "filtered": {
        "query": {
            "match_all": {}
        },
        "filter": {
            "regexp":{
                "filename" : "*mail*"
            }
        }
    }
}

注意邮件上的小写“m”。默认情况下,Elasticsearch使用小写标记生成器分析所有字段。因此,当搜索大写的“邮件”时,Elasticsearch将从返回的结果中排除所有分析的字段。您可以通过将字段标记为“not_analyzed”或创建自己的自定义分析器来关闭默认的小写标记器。

另外,请注意,在搜索大型数据集时,使用通配符(尤其是在查询开头时)可能会非常慢且占用大量内存。