我正在尝试在查询时间提供分析器,这不起作用。
放置客户
PUT customer_new / _settings
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"digit"
]
}
}
}
}
}
获取客户/ _搜索
{
"query": {
"match": {
"phonenumber": { "query":"678",
"analyzer": "my_analyzer"
}
}
}
}
但这不会返回任何结果。
POST客户/验证/查询?解释
{
"query": {
"match": {
"phonenumber": { "query":"678",
"analyzer": "my_analyzer"
}
}
}
}
{
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"valid": true,
"explanations": [
{
"index": "customer",
"valid": true,
"explanation": "phonenumber:678"
}
]
}
我要更新索引的原因是我已经拥有索引。我想做的是,我可以通过多种方式在字段上进行搜索,因此我想即时添加分析仪,然后在查询时使用它们。
我认为,如果我重新索引并通过更新映射在电话号码字段中配置此分析器,则它将起作用。但是就像我上面提到的,我不想重新索引,因为有数百万条记录,而且频繁地重新索引不是一种选择。
有没有办法解决这个问题?
答案 0 :(得分:1)
简短的回答:您将不得不为文档重新编制索引
在查询中指定分析器时,查询中的文本将使用此分析器,而不是文档中的字段。
例如,如果您使用默认分析器为“ Hello”建立索引并使用不带小写字母的分析器搜索“ Hello”,则不会得到结果,因为您将尝试将“ Hello”与“ hello”(即小写)进行匹配
唯一的解决方案应用新映射是对文档重新编制索引。您不能仅重新索引映射更改的字段。
这可能不是您要寻找的解决方案,但是这里有一些提示可以解决此问题:
如果使用ngram分析器在术语内搜索,则可以将wildcard query与*<SEARCH_TERM>*
一起使用。 234
将与12345
相匹配。您无需创建新的分析器,因为您只需更改查询即可。请注意,它将带来重要的查询开销。
不是重新索引整个索引,而是创建文档的子集。使用_reindex
端点可以轻松完成此操作。仅使用此子集来测试和改善映射,对结果满意后,即可重新索引所有文档。
如果尚未使用它们,请使用alias
使该应用程序的重新编制索引透明。