Elasticsearch:查找子字符串匹配
我想同时执行完全的单词匹配和部分的单词/子字符串匹配。例如,如果我搜索“男士剃须刀”,那么我应该能够在结果中找到“男士剃须刀”。但是,如果我搜索“剃须刀”,那么在结果中我也应该能够找到“剃须刀”。我使用以下设置和映射:
索引设置:
PUT /my_index
{
"settings": {
"number_of_shards": 1,
"analysis": {
"filter": {
"autocomplete_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 20
}
},
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"autocomplete_filter"
]
}
}
}
}
}
对应:
PUT /my_index/my_type/_mapping
{
"my_type": {
"properties": {
"name": {
"type": "string",
"index_analyzer": "autocomplete",
"search_analyzer": "standard"
}
}
}
}
插入记录:
POST /my_index/my_type/_bulk
{ "index": { "_id": 1 }}
{ "name": "men's shaver" }
{ "index": { "_id": 2 }}
{ "name": "women's shaver" }
查询:
1.按完全匹配的词组进行搜索- >“男式”
POST /my_index/my_type/_search
{
"query": {
"match": {
"name": "men's"
}
}
}
上面的查询在返回结果中返回“男士剃须刀”。
2.按部分单词匹配搜索- >“ en’s”
POST /my_index/my_type/_search
{
"query": {
"match": {
"name": "en's"
}
}
}
上面的查询不返回任何内容。
我也尝试过以下查询
POST /my_index/my_type/_search
{
"query": {
"wildcard": {
"name": {
"value": "%en's%"
}
}
}
}
仍然什么也没得到。我发现这是因为Index上的“ edge_ngram”类型过滤器无法找到“部分单词/字符串匹配”。我也尝试过“
n-gram”类型的过滤器,但是它大大降低了搜索速度。
请建议我如何使用相同的索引设置同时实现精确短语匹配和部分短语匹配。
-
要搜索部分字段匹配和完全匹配,如果将字段定义为“未分析”或关键字(而不是文本),然后使用 通配符查询 ,则效果更好。
要使用通配符查询,请在要搜索的字符串的两端添加*:
POST /my_index/my_type/_search { "query": { "wildcard": { "name": { "value": "*en's*" } } } }
若要 不区分大小写 使用,请使用带有小 写过滤器和关键字标记器 的自定义分析器。
自定义分析器:
"custom_analyzer": { "tokenizer": "keyword", "filter": ["lowercase"] }
使搜索字符串小写
如果您将搜索字符串转换为 AsD* :将其更改为 asd ***
-
查询以查找子字符串的所有匹配行
2021-05-10 关注 0 浏览99 1答案
-
Python:在字符串中查找子字符串并返回该子字符串的索引
2021-01-29 关注 0 浏览129 1答案
-
查找Java中字符串中所有出现的子字符串
2021-01-30 关注 0 浏览138 1答案
-
查找所有与给定字符串相加的子字符串组合
2021-01-31 关注 0 浏览131 1答案
-
PHP查找字符串中所有出现的子字符串
2021-02-02 关注 0 浏览118 1答案
-
如何在Oracle中的字符串中查找精确的字符串匹配
2021-04-20 关注 0 浏览217 1答案
-
查找所有匹配的子字符串,而不仅仅是“最扩展的”
2021-01-30 关注 0 浏览82 1答案
-
如何查找和替换字符串中所有出现的子字符串?
2021-01-31 关注 0 浏览148 1答案
-
如何在字符串中查找子字符串(或如何grep变量)?
2021-02-01 关注 0 浏览195 1答案
-
查找字符串中最后出现的子字符串的索引
2021-01-29 关注 0 浏览86 1答案