弹性搜索查询在大型数据集上返回意外结果

时间:2018-04-25 17:12:58

标签: c# elasticsearch nest

我有一个弹性搜索数据库,里面有330万条记录。当我像这样进行搜索时

elasticClient.Search<ElasticIndex>(s => s.Size(100).From(0).Query(q =>
            q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c.d.e.f")))).Total

我得到27个结果,这是我所期待的。当我运行像这样的查询时

elasticClient.Search<ElasticIndex>(s => s.Size(100).From(0).Query(q =>
            q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c")))).Total

我得到了2,133个结果,这是我所期待的。但是当我运行这样的查询时

elasticClient.Search<ElasticIndex>(s => s.Size(100).From(0).Query(q =>
            q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c")) &&
            q.MatchPhrasePrefix(f => f.OnField(i => i.Search).Query("a.b.c.d.e.f")))).Total

我得到0结果。我希望得到a.b.c.d.e.f得到的27,因为a.b.c只是a.b.c.d.e.f的子串。

对我来说更奇怪的是,如果我将27个文档复制到一个索引,然后运行查询,则返回预期的27个结果。如果我开始将文档从大索引移动到大约50,000到80,000个文档的新索引,则查询开始返回较少的结果。如果我继续复制文档,查询将继续返回较少,直到它返回0但查询MatchPrasePrefix(a.b.c或a.b.c.d.e.f)仍然只返回正确的结果&amp;&amp; 2的结果是错误的结果。

我理解查询abc和abcdef是没有用的,我可以做abcdef,但我的最终用户正在进行这样的搜索,并希望它能够工作而不必解析传入的搜索并尝试查找冗余的术语然后在发送到数据库之前删除。我觉得必须有一个我缺少的超时选项或者什么。任何帮助表示赞赏。

这是弹性搜索json查询。只需a.b.c.d.e.f

    {
  "from": 0,
  "size": 100,
  "query": {
    "match": {
      "search": {
        "type": "phrase_prefix",
        "query": "a.b.c.d.e.f"
      }
    }
  }
}

同时

{
  "from": 0,
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "search": {
              "type": "phrase_prefix",
              "query": "a.b.c.d.e.f"
            }
          }
        },
        {
          "match": {
            "search": {
              "type": "phrase_prefix",
              "query": "a.b.c"
            }
          }
        }
      ]
    }
  }
}

0 个答案:

没有答案