【发布时间】:2020-03-06 20:00:19
【问题描述】:
我们正在将搜索策略从数据库迁移到 ElasticSearch。在此期间,我们需要保留部分搜索类似于以下 SQL 查询的字段的现有功能(包括空格):
SELECT *
FROM customer
WHERE customer_id LIKE '%0995%';
话虽如此,我已经阅读了多篇与 ES 相关的文章并实现了上述功能。在上述练习之后,我想出了以下内容:
- 我阅读的大部分文章都推荐使用 nGram 分析器/过滤器;因此以下是映射和设置的样子:
注意: customer_id 字段的最大长度为 VARCHAR2(100)。
{
"customer-index":{
"aliases":{
},
"mappings":{
"customer":{
"properties":{
"customerName":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
}
},
"customerId":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword",
"ignore_above":256
}
},
"analyzer":"substring_analyzer"
}
}
}
},
"settings":{
"index":{
"number_of_shards":"3",
"provided_name":"customer-index",
"creation_date":"1573333835055",
"analysis":{
"filter":{
"substring":{
"type":"ngram",
"min_gram":"3",
"max_gram":"100"
}
},
"analyzer":{
"substring_analyzer":{
"filter":[
"lowercase",
"substring"
],
"type":"custom",
"tokenizer":"standard"
}
}
},
"number_of_replicas":"1",
"uuid":"XXXXXXXXXXXXXXXXX",
"version":{
"created":"5061699"
}
}
}
}
}
查询数据的请求如下所示:
{
"from": 0,
"size": 10,
"sort": [
{
"name.keyword": {
"missing": "_first",
"order": "asc"
}
}
],
"query": {
"bool": {
"filter": [
{
"query_string": {
"query": "0995",
"fields": [
"customer_id"
],
"analyzer": "substring_analyzer"
}
}
]
}
}
}
话虽如此,这里有几个查询/问题:
- 假设有 3 条记录带有 customer_id:
0009950011214, 0009900011214, 0009920011214
当我搜索“0995”时。理想情况下,我期待只获得 customer_id: 0009950011214。
但是我将所有三个记录都作为结果集的一部分,我相信这是由于 nGram 分析器及其拆分字符串的方式(注意:minGram:3 和 maxGram:100)。将 maxGram 设置为 100 是为了完全匹配。
我应该如何解决这个问题?
- 这就引出了我的第二点。对这种需求使用 nGram 分析器是最有效的策略吗?我担心的是 minGram = 3 和 maxGram = 100 的内存利用率。有没有更好的方法来实现相同的?
P.S:我在 NEST 5.5 上。
【问题讨论】:
标签: elasticsearch nest