当前位置: 首页 > 面试题库 >

Elasticsearch-使用路径层次标记器访问不同级别的类别

查淮晨
2023-03-14
问题内容

我是Elasticsearch的新手,并且对路径的分层标记器有疑问。这是我的代码示例:

我的映射代码:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "path-analyzer": {
          "type": "custom",
          "tokenizer": "path-tokenizer"
        }
      },
      "tokenizer": {
        "path-tokenizer": {
          "type": "path_hierarchy",
          "delimiter": "."
        }
      }
    }
  },
  "mappings": {
    "my_type": {
      "dynamic": "strict",
      "properties": {
        "group_path": {
          "type": "string",
          "index_analyzer": "path-analyzer",
          "search_analyzer": "keyword"
        }
      }
    }
  }
}

这是我的PUT:

PUT /my_index/my_type/1
{
  "group_path": ["Book.Thriller.Adult","DVD.Comedy.Kids"]
}

这是我的查询:

GET /my_index/my_type/_search?search_type=count
{
   "aggs": {
      "category": {
         "terms": {
            "field": "group_path",
            "size": 0
         }
      }
   }
}

结果:

{
   ...
   "aggregations": {
      "category": {
         "buckets": [
            {
               "key": "Book",
               "doc_count": 1
            },
            {
               "key": "Book.Thriller",
               "doc_count": 1
            },
            {
               "key": "Book.Thriller.Adult",
               "doc_count": 1
            },
            {
               "key": "DVD",
               "doc_count": 1
            },
            {
               "key": "DVD.Comedy",
               "doc_count": 1
            },
            {
               "key": "DVD.Comedy.Kids",
               "doc_count": 1
            }
         ]
      }
   }
}

到目前为止,一切都很好。我正在寻找的是如何仅针对第一类创建存储桶。我如何获得这样的结果:

{
   ...
   "aggregations": {
      "category": {
         "buckets": [
            {
               "key": "Book",
               "doc_count": 1
            },
            {
               "key": "DVD",
               "doc_count": 1
            }
         ]
      }
   }
}

感谢您的任何帮助。


问题答案:

我发现这样做的唯一方法是使用exclude语法排除不需要的级别。

    {
   "aggs": {
      "category": {
         "terms": {
            "field": "group_path",
            "size": 0, 
            "exclude" : ".*\\..*"
         }
      }
   }
}

然后将返回

aggregations: {
     category: {
       buckets: [
          {
             key: Book
             doc_count: 1
          }
          {
             key: DVD
            doc_count: 1
          }
       ]
     }
}

如果您选择书籍,则可以像这样搜索

{
    "query" : {
        "filtered": {
            "filter": {
        "prefix": {
          "group_path": "Book"
        }
            }
        }
    },
    "aggs" : {
      "category": {
        "terms": {
          "field": "group_path",
          "size": 0,
          "include" : "Book\\..*",
          "exclude": ".*\\..*\\..*"
        }
      }
    }
}

然后将返回

aggregations: {
     category: {
       buckets: [
          {
             key: Book.Thriller
             doc_count: 1
          }
       ]
     }
}


 类似资料:
  • 在log4j2文档log4j2 java配置中,默认配置为: 根本就不在那里。它仍将只打印出错误日志。 问题 是否有其他人遇到此问题? 有人能复制它吗? 有人知道怎么修吗?我几乎要给别人一块钱。不过,我肯定会把他们的答案标成绿色。 我的最终目标是让特定的记录器发送SMTP请求。我很确定我知道怎么做,我只是在和这个小问题作斗争

  • 我还希望com.mypack的级别“trace”与“info”的行为方式相同。到目前为止,我还没有取得任何成功。我需要像这样的东西 感谢你的帮助。

  • 我想访问项目“\src\main\resources”的资源形式,但由于任何原因,我只能访问目标类。这是我的代码: 这里是我的Project Dir: 问题是,即使我删除了目标/类中的所有文件并运行代码,编译器也会将文件从“src/main/ressource”复制到“目标/类”中并从那里读取它们。

  • 问题内容: 我想使用Log4J记录我的Java项目。我在src目录中创建了一个log4j.properties文件,其内容如下: 例如,我只想在我的主要方法中使用“ DEFAULT_LOGGER”。所以我写道: 但是,当我执行main方法时,我将消息“ Process Logger”打印到所有Appender(stdout,file和file2),但是我只想将其打印到file2。我该怎么做,或者更

  • 如何在SL4J中配置日志记录?我的项目有很多类:class1、class2、Class3....我想做两件事:将所有类记录到一个名为FILE1的文件追加器中,并具有警告级别(class1、class2、class3...)将一个名为class1的类记录到具有调试级别的名为FILE2的文件追加器中。 问题是,当我将class1的记录器配置为具有WARN级别的FILE1 appender时,我不知道如

  • 我有一个情况,我有两个追加器,一个写到控制台,另一个写到文件。我想记录除一个类以外的所有调试级别的东西。对于这个类,我想要记录调试到控制台,错误到文件。 我发现这种过滤是通过类别标记完成的,但是我还没有设法将不同的级别拆分给特定类上的不同追加器。