Эластичный поисковый запрос, возвращающий неожиданные результаты в больших наборах - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть эластичная поисковая база данных с 3,3 миллионами записей в ней. Когда я запускаю такой поиск

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

Я получаю 2133 результатов, что я и ожидаю. Но когда я запускаю такой запрос,

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 результатов. Я ожидаю получить 27, которые a.b.c.d.e.f получил как 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) все еще будут возвращаться правильные результаты, только && из 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"
            }
          }
        }
      ]
    }
  }
}
...