tokenize - 为什么当特殊字符可用时 ElasticSearch 无法搜索?
问题描述
我有一个具有以下配置的 ElasticSearch 索引:
{
"my_ind": {
"settings": {
"index": {
"mapping": {
"total_fields": {
"limit": "10000000"
}
},
"number_of_shards": "3",
"provided_name": "my_ind",
"creation_date": "1539773409246",
"analysis": {
"analyzer": {
"default": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "whitespace"
}
}
},
"number_of_replicas": "1",
"uuid": "3wC7i-E_Q9mSDjnTN2gxrg",
"version": {
"created": "5061299"
}
}
}
}
}
我想用普通搜索搜索以下内容:
DL-1234170386456
此内容可在以下字段中找到:
DNumber
该文件的映射如下:
{
"DNumber": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
我正在尝试用 JAVA 语言实现它。我遇到了 ElasticSearch 分析器和标记器,所以我使用了“空白”标记器。
我正在尝试使用以下查询进行搜索:
{
"query": {
"multi_match": {
"query": "DL-1234170386456",
"fields": [
"_all"
],
"type": "best_fields",
"operator": "OR",
"analyzer": "default",
"slop": 0,
"prefix_length": 0,
"max_expansions": 50,
"lenient": false,
"zero_terms_query": "NONE",
"boost": 1
}
}
}
我做错了什么?
解决方案
经过大量研究和反复试验,找到了答案!
一些基本但重要的点:
- 我们需要在创建/索引索引/数据时指定分析器和标记器。
- 在指定的字符串,即“DL-1234170386456”中,特殊字符(即“-”)可用,ElasticSearch 默认使用标准分析器。
- 标准分析器包含基于 Unicode 文本分割算法的标准标记器。
实际问题:
ElasticSearch 将字符串(“DL-1234170386456”)分成两个不同的部分,如“DL”和“1234170386456”。
解决方案:
- 我们需要指定包含Whitespace Tokenizer的Whitespace Analyzer。
- 每当遇到空格时,它都会拆分单词。因此,String ("DL-1234170386456") 将由 ElasticSearch 保持原样,我们能够找到它。
推荐阅读
- javascript - 将日期范围划分为已知数量的相等块
- android - 为什么当我使用 Android 导航组件返回片段时总是触发我的 onCreate?
- r - 使用 R 将十六进制字符串转换为 64 位整数/时间戳
- r - 从 HTML 发布到 RPubs 不再是一种选择了吗?
- pandas - pandas 中的大于和小于函数
- enums - Rust 中逻辑上但非法的未初始化变量
- sympy - 收集所有涉及 sympy 因素的术语
- javascript - 没有调用第二个 Success 函数中的 Ajax 函数
- c# - 如何将 .NET TcpListener 的多个证书设置为服务器?
- sql - SQL if 参数为空字符串查询整个数据库 else 查询仅过去 10 天