0

我正在使用弹性搜索来搜索存储在 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" : [ ]
  }
}
4

1 回答 1

0

您可以使用正则表达式过滤器(或正则表达式查询):

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

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

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

于 2013-09-10T02:49:02.547 回答