gpt4 book ai didi

elasticsearch - 进行映射后获得精确匹配 not_analyzed

转载 作者:行者123 更新时间:2023-12-02 22:16:34 26 4
gpt4 key购买 nike

我映射的elasticsearch类型如下,

mappings": {
"jardata": {
"properties": {
"groupID": {
"index": "not_analyzed",
"type": "string"
},
"artifactID": {
"index": "not_analyzed",
"type": "string"
},
"directory": {
"type": "string"
},
"jarFileName": {
"index": "not_analyzed",
"type": "string"
},
"version": {
"index": "not_analyzed",
"type": "string"
}
}
}
}

我正在使用分析的目录索引,因为我只想给出最后一个文件夹并获取结果,但是当我想搜索特定目录时,我需要给出整个路径,因为两个路径中可以有相同的文件夹。这里的问题是,因为它被分析,所以它会分析所有数据,而不是我想要的特定数据。

这里的问题是我想像已分析和未分析一样行事。有办法吗?

最佳答案

假设您对以下文档建立了索引:

{
"directory": "/home/docs/public"
}

标准分析器对于您的情况来说是不够的,因为它会在索引时创建以下术语:

[home, docs, public]

请注意,它缺少 [/home/docs/public] 标记 - 像“/”等字符在这里充当分隔符。

一种解决方案可能是使用 NGram具有 token_chars 列表中的 punctuation 字符类的分词器。 Elasticsearch 会将“/”视为字母或数字。这将允许使用以下标记进行搜索:

[/hom, /home, ..., /home/docs/publi, /home/docs/public, ..., /docs/public, etc...]

索引映射:

{
"settings": {
"analysis": {
"analyzer": {
"ngram_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 4,
"max_gram": 18,
"token_chars": [
"letter",
"digit",
"punctuation"
]
}
}
}
},
"mappings": {
"jardata": {
"properties": {
"directory": {
"type": "string",
"analyzer": "ngram_analyzer"
}
}
}
}
}

现在两个搜索查询:

{
"query": {
"bool" : {
"must" : {
"term" : {
"directory": "/docs/private"
}
}
}
}
}

{
"query": {
"bool" : {
"must" : {
"term" : {
"directory": "/home/docs/private"
}
}
}
}
}

将在结果中给出索引文档。

您必须考虑的一件事是在“max_gram”设置中指定的 token 的最大长度。如果是目录路径,则可能需要更长的时间。

替代解决方案是使用 Whitespace tokenizer ,仅在空格上将短语分解为术语,并且 NGram filter具有以下映射:

{
"settings": {
"analysis": {
"filter": {
"ngram_filter": {
"type": "ngram",
"min_gram": 4,
"max_gram": 20
}
},
"analyzer": {
"my_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"ngram_filter"
]
}
}
}
},
"mappings": {
"jardata": {
"properties": {
"directory": {
"type": "string",
"analyzer": "my_analyzer"
}
}
}
}
}

关于elasticsearch - 进行映射后获得精确匹配 not_analyzed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46188474/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com