ElasticSearch - 查询匹配路径的任何部分(path_hierarchy tokenizer)

时间:2015-12-02 01:31:06

标签: elasticsearch

道歉,如果这很容易,但我自己无法提出查询或在网上找到答案。

如果我的elasticsearch索引中有一个字段'category',它使用path_hierarchy tokenizer存储分类结构,有没有办法查询和匹配该路径中的任何单词?

PUT /stuff
{
  "settings": {
    "analysis": {
      "analyzer": {
        "categories": { 
          "tokenizer": "path_hierarchy"
        }
      }
    }
  }
}

PUT /stuff/_mapping/item
{
  "properties": {
    "name": { 
      "type":  "string",
      "index": "not_analyzed"
    },
    "category": { 
      "type":  "string",
      "index": "not_analyzed",
      "fields": {
        "tree": { 
          "type":     "string",
          "analyzer": "categories"
        }
      }
    }
  }
}

然后我提出了几个项目:

PUT /stuff/item/1 {"name": "The Killer Books", "category": "Entertainment/Movie/Horror"}
PUT /stuff/item/2 {"name": "The Adventure", "category": "Entertainment/Books And Stories/Fantasy"}

然后我有一个用户搜索'Books'。它只是自由格式文本,我没有任何其他参数可以帮助查明类别。我想获得一部名为“The Killer Books”的电影,但随后也会在“娱乐/书籍与故事”中获取该文件。

如果用户只搜索“故事”,我也想返回第二个文档。

我遇到的问题是,我不能轻易地从单独的搜索术语中看出术语可能属于路径结构的位置。有没有办法正确查询?我尝试了以下查询但没有成功:

GET /stuff/item/_search
{
  "query":{
     "multi_match":{ 
        "query":"Books",
        "fields":["title", "category"]
      }
  }
}

1 个答案:

答案 0 :(得分:1)

我不确定你为什么要使用path_hierarchy tokenizer。要使您的查询生效,您可以使用standard analyzer这样的字段映射

PUT /stuff/_mapping/item
{
  "properties": {
    "name": { 
      "type":  "string" <--- using default standard analyzer
    },
    "category": { 
      "type":  "string" <---- using default standard analyzer
      "fields": {
        "tree": { 
          "type":     "string",
          "analyzer": "categories"
        }
      }
    }
  }
}

现在您的查询

GET /stuff/item/_search
    {
      "query":{
         "multi_match":{ 
            "query":"Books",
            "fields":["name", "category"]
          }
      }
    }

会给你两份文件。我删除了"index" : "not_analyzed"因为它将索引字符串,因此 Killer Books 将按原样编入索引但是standard analyzer它会生成三个标记,杀手,书籍,因此您的查询将起作用。

利用analyze endpoint查看您的数据是如何编入索引的,并且编写查询很容易。

我希望这会有所帮助。