Kibana 弹性检索词查询未给出结果,但给出了匹配查询

o4hqfura  于 2023-02-20  发布在  Kibana
关注(0)|答案(2)|浏览(128)

我正在使用Kibana查询

GET /MY_INDEX_HERE/_search
{
  "query": {
    "match": {
      "AccountId": 
        "bc73afda-d4f2"
      
    }
  }
}

我希望它能给出结果。但是当我使用terms查询时,它没有显示任何结果,尽管值是相同的。没有任何字符或大小写的差异,所有内容都是小写的。
我的最终目标是在C#代码中获得结果。

.Query(q => q.Raw(strQuery) && q.Terms(c => c.Name("by_account").Field(p => p.AccountsList).Terms(accountTerms))

使用此查询时,我得到的结果为零,但如果注解第二个查询,则会得到结果:

.Query(q => q.Raw(strQuery) //&& q.Terms(c => c.Name("by_account").Field(p => p.AccountsList).Terms(accountTerms))

现在我的

strQuery ={\"bool\":{\"must\":[{\"match_phrase_prefix\":{\"fullname\":\"test\"}}]}}

以及

List<string> accountTerms = new List<string>();
                accountTerms.Add("bc73afda-d4f2");

AccountIdGUID类型,我不能在这里粘贴完整的值,因此它不是一个完整的值。

h9a6wy2h

h9a6wy2h1#

我假设您的数据存储在text字段中,这是一个分析字段类型。
如果使用标准分析器,源代码bc73afda-d4f2将转换为两个标记bc73afdad4f2,因此,如果查询术语bc73afda-d4f2,则没有匹配的标记。
现在您有不同的选项,具体取决于您想要实现什么以及您可以影响哪些部分(Elasticsearch和/或C#代码)。
1.您可以编辑第二个查询以使用match而不是term
1.可以将第二个条件添加到现有的strQuery中,其内容大致如下:

\"bool\":{\"must\":[{\"match_phrase_prefix\":{\"fullname\":\"test\"}},{\"match\":{\"AccountId\":\"bc73afda-d4f2\"}}]}}

1.如果您的Map是一个多类型text/keyword字段,或者您可以将其转换为一个字段(或者仅使用keyword字段而不是text),则可以使用terms查询来查询AccountId.keyword字段。keyword字段不会被分析,因此term查询bc73afda-d4f2将是一个不错的选择。
1.你可以使用一个定制的分析器来重新索引你的数据。但是这可能是矫枉过正/错误的方法来解决你的问题。

ulmd4ohb

ulmd4ohb2#

Kibana“terms”查询疑难解答

terms查询是一个精确匹配查询,这意味着它在匹配查询输入或字段值之前不会对其进行分析。
如果索引中的AccountId字段已Map为keyword字段或keyword类型的文本字段,则输入的bc73afda-d4f2将被视为单个术语,并且仅当字段值完全匹配(包括大小写)时才匹配。
检查AccountId的Map:

GET /MY_INDEX_HERE/_mapping/field/AccountId

如果字段的typetextkeyword,请调整查询以使用字段的确切大小写和值。
或者,您可以使用match_phrase查询而不是terms查询来匹配AccountId字段的确切短语,而不考虑大小写。

GET /MY_INDEX_HERE/_search
{
  "query": {
    "match_phrase": {
      "AccountId": "bc73afda-d4f2"
    }
  }
}

相关问题