【问题标题】:Term query does not return any results词条查询不返回任何结果
【发布时间】:2019-03-05 14:16:31
【问题描述】:

我正在尝试使用嵌套术语查询在弹性搜索中查找一些实体。如果我执行我的搜索查询,则没有命中。但是,如果我将查询更改为使用“匹配”而不是“术语”,我将获得成功。我可能做错了什么?

我想要实现的是只返回完全匹配。

ES中的实体如下

"vehiclesCollection": [
    {
        "id": "c0163692-69c5-442e-a30c-a3789384904d",
        "additionalFields": {
            "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-    348f3e6a5485@1a61281d-73b0-41ea-964d-d869a172752d": "HaveNoIdea",
            "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@91b5e07e-6e09-4a81-a3ef-d43f1ea99b34": "Strane",
            "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@4fc4d50b-5c81-47f7-8c7a-7802c28c0dca": true,
            "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@c35b1e06-f918-4f70-a323-804c004ddcbe": "License Plate"
        },
        "searchableAdditionalFieldValues": [
            "License Plate",
            "Strane",
            "HaveNoIdea"
        ]
    }
]

提示:这只是我执行搜索的部分。

它有以下映射

{
  "vehiclesCollection": {
    "type": "nested",
    "properties": {
      "additionalFields": {
        "properties": {
          "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@1a61281d-73b0-41ea-964d-d869a172752d": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@4fc4d50b-5c81-47f7-8c7a-7802c28c0dca": {
            "type": "boolean"
          },
          "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@91b5e07e-6e09-4a81-a3ef-d43f1ea99b34": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@c35b1e06-f918-4f70-a323-804c004ddcbe": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "id": {
        "type": "keyword"
      },
      "searchableAdditionalFieldValues": {
        "type": "text",
        "index_options": "offsets",
        "analyzer": "ngram_tokenizer_analyzer",
        "search_analyzer": "whitespace_analyzer"
      }
    }
  }
}

和搜索查询(如果用匹配切换术语,它将起作用,但我只想要完全匹配)

{
  "bool": {
    "must": [
      {
        "nested": {
          "query": {
            "term": {
              "vehiclesCollection.additionalFields.23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@c35b1e06-f918-4f70-a323-804c004ddcbe": {
                "value": "License Plate",
                "boost": 1
              }
            }
          },
          "path": "vehiclesCollection",
          "ignore_unmapped": false,
          "score_mode": "avg",
          "boost": 1
        }
      },
      {
        "nested": {
          "query": {
            "term": {
              "vehiclesCollection.additionalFields.23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@1a61281d-73b0-41ea-964d-d869a172752d": {
                "value": "HaveNoIdea",
                "boost": 1
              }
            }
          },
          "path": "vehiclesCollection",
          "ignore_unmapped": false,
          "score_mode": "avg",
          "boost": 1
        }
      },
      {
        "nested": {
          "query": {
            "term": {
              "vehiclesCollection.additionalFields.23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@4fc4d50b-5c81-47f7-8c7a-7802c28c0dca": {
                "value": true,
                "boost": 1
              }
            }
          },
          "path": "vehiclesCollection",
          "ignore_unmapped": false,
          "score_mode": "avg",
          "boost": 1
        }
      }
    ]
  }
}

我的第一个想法是它与搜索分析有关。但我不确定如何为这个特定查询设置它们。我正在使用 Elasticsearch Java API。

【问题讨论】:

    标签: elasticsearch term-query


    【解决方案1】:

    经验法则是你需要

    • .keyword 子字段上运行您的 term 查询
    • text 顶级字段上运行匹配查询

    所以您的查询将是(前两个嵌套的term 查询使用***.keyword 子字段):

    {
      "bool": {
        "must": [
          {
            "nested": {
              "query": {
                "term": {
                  "vehiclesCollection.additionalFields.23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@c35b1e06-f918-4f70-a323-804c004ddcbe.keyword": {
                    "value": "License Plate",
                    "boost": 1
                  }
                }
              },
              "path": "vehiclesCollection",
              "ignore_unmapped": false,
              "score_mode": "avg",
              "boost": 1
            }
          },
          {
            "nested": {
              "query": {
                "term": {
                  "vehiclesCollection.additionalFields.23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@1a61281d-73b0-41ea-964d-d869a172752d.keyword": {
                    "value": "HaveNoIdea",
                    "boost": 1
                  }
                }
              },
              "path": "vehiclesCollection",
              "ignore_unmapped": false,
              "score_mode": "avg",
              "boost": 1
            }
          },
          {
            "nested": {
              "query": {
                "term": {
                  "vehiclesCollection.additionalFields.23698e0d-e5ba-4c0e-9c41-09db40708f09@11b75c17-1f62-4a45-847b-348f3e6a5485@4fc4d50b-5c81-47f7-8c7a-7802c28c0dca": {
                    "value": true,
                    "boost": 1
                  }
                }
              },
              "path": "vehiclesCollection",
              "ignore_unmapped": false,
              "score_mode": "avg",
              "boost": 1
            }
          }
        ]
      }
    }
    

    【讨论】:

    • 是的,这就是解决方案。因此,如果我正确理解,如果值为布尔值,您将无法运行术语查询并使用 fieldName.keyword ?
    • 我没有触及布尔字段上的术语查询,那个是正确的。前两个不是,因为您正在对文本(已分析)字段运行术语查询。术语查询最适合“精确匹配”。因此,如果您要搜索“车牌”以完全匹配,则需要在关键字字段上使用术语查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多