Elasticsearch noob在这里试图了解一些东西
我有这个查询
{
"size": 10,
"_source": "pokemon.name",
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"multi_match": {
"_name": "name-match",
"type": "phrase",
"fields": ["pokemon.name"],
"operator": "or",
"query": "pika"
}
},
{
"multi_match": {
"_name": "weight-match",
"type": "most_fields",
// I use multi_match because I'm not sure how can I change it to match
"fields": ["pokemon.weight"],
"query": "10kg"
}
}
]
}
}
}
问题是pokemon.weight
在值和单位10 Kg
之间有一个空格。因此,我需要忽略空格以与10kg
我试图更改令牌生成器,可悲的是它可以决定在哪里拆分但不能删除字符。无论如何,我不知道如何使用它,文档也不是很有帮助,它解释了理论,但没有解释如何使用。
谢谢!任何学习资源将不胜感激。
答案 0 :(得分:3)
您需要使用char filter
定义自定义分析器。在这里您将用space
字符替换empty
字符,以便在您的情况10
和g
中生成的令牌变为10g
。我在本地尝试过,对我来说很好。
奖金链接,用于了解analysis在ES中的工作方式以及使用char filters的自定义分析器的示例。
以下是我的自定义分析器,用于获取必需的令牌:-
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"my_char_filter"
]
}
},
"char_filter": {
"my_char_filter": {
"type": "mapping",
"mappings": [
"\\u0020=>"
]
}
}
}
}
}
现在使用相同的分析器,它在令牌下方生成,我使用analyze api确认了该令牌。
端点:-http:// {{your_hostname}}:9500 / {{your_index_name}} / _analyzer
body:-
{
"analyzer" : "my_analyzer",
"text" : "10 g"
}
结果:-
{
"tokens": [
{
"token": "10g",
"start_offset": 0,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 0
}
]
}