Я использую Elastic 6.5.
Мне нужно включить поиск пустой строки с одним из критериев, которые я прохожу.
primaryKey = 1, 2, 3
subKey = "" или subKey = "A" вместе со множеством других критериев.
Мне не удалось получить запись с пустым subKey.
Я пытался использовать MUST_NOT EXISTS, но он не извлекает соответствующую запись.
Поэтому ниже должны возвращаться все записи, у которых primarykey равен 1, 2 или 3. и subKey.'A' или пустая строка.Отфильтровано по указанной дате.Я получаю все записи, кроме записи, в которой subKey пуст.
, поэтому я попробовал это:
{
"size": 200, "from": 0,
"query": {
"bool": {
"must": [{
"bool": {
"should": [{ "terms": {"primaryKey": [1,2,3] }}]
}
},
{
"bool": {
"should": [
{"match": {"subKey": "A"}},
{
"bool" : {
"must_not": [{ "exists": { "field": "subKey"} }]
}
}
]
}
}],
"filter": [{"range": {"startdate": {"lte": "2018-11-01"}}}]
}
}
}
Поле подключа является специальным ..., где оно на самом деле ищется ПИСЬМО.Но я не думаю, что это что-то повлияет ... но вот код NEST, который у меня есть для этого индекса.
new CreateIndexDescriptor("SpecialIndex").Settings(s => s
.Analysis(a => a
.Analyzers(aa => aa
.Custom("subKey_analyzer", ma => ma
.Tokenizer("subKey_tokenizer")
.Filters("lowercase")
)
)
.Tokenizers(ta => ta
.NGram("subKey_tokenizer", t => t
.MinGram(1)
.MaxGram(1)
.TokenChars(new TokenChar[] { TokenChar.Letter, TokenChar.Whitespace })
)
)
)
)
.Mappings(ms => ms
.Map<SpecialIndex>(m => m
.Properties(p => p
.Text(s => s
.Name(x => x.subKey)
.Analyzer("subKey_analyzer")
)
)
));
Есть идеи, как решить эту проблему?Большое спасибо!
ПРИМЕЧАНИЕ: я видел сообщения о том, что это можно сделать с помощью фильтра, используя отсутствующие.Но как вы можете видеть из запроса, мне нужен Query для этого, а не фильтр.
Я также попробовал следующее, а не MUST_NOT EXISTS
{
"term": { "subKey": { "value": "" }}
}
, но нене работаетЯ думаю, мне нужен еще один токенизатор, чтобы это заработало.