我的文件中有一个有价值的状态"好的"。
以下匹配查询返回此文档:
POST /bank/_search
{
"query": {
"bool" : {
"must" : {
"match" : { "state" : "OK" }
}
}}}
以下术语查询不会返回状态为" OK":
的文档POST /bank/_search
{
"query": {
"bool" : {
"must" : {
"term" : { "state" : "OK" }
}
}}}
根据定义"术语查询查找包含倒排索引中指定的确切术语的文档。"我仍然很困惑为什么术语查询不会返回所需的文档。
我通过执行以下命令通过sense导入数据:
curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary "@accounts.json"
curl 'localhost:9200/_cat/indices?v'
如果有人也可以分享有关倒置/非倒置,分析/非分析和术语/匹配的信息,那将会很棒。我读到了这些但我仍感到困惑。
答案 0 :(得分:2)
匹配查询始终在执行匹配之前对搜索文本执行分析,但 Term 查询会查找完全匹配。装置
当您插入文本"确定"时,默认ES执行分析(标准分析器)并将文本存储为"确定"反转指数(小写)。
所以使用匹配查询
进行搜索时POST /bank/_search
{
"query": {
"bool" : {
"must" : {
"match" : { "state" : "OK" }
}
}}}
" OK"文本转换为" ok"(根据状态分析器)并执行匹配。
对于术语查询,您必须手动将文本更改为较低的文本,因为它不会对搜索时间进行分析。
POST /bank/_search
{
"query": {
"bool" : {
"must" : {
"term" : { "state" : "ok" } //lowercased
}
}}}
如果您一直在寻找" OK",那么您可以添加" Not Analyzed"在国家财产。 这意味着在存储时不会对状态属性进行分析和存储,那么您的术语和匹配查询将看起来很准确。