弹性搜索与字段中的 space 最接近的匹配项
Elastic Search Closest match with space in fields
我在包含 “面罩” 的 elasticsearch 字段中有数据,我可以通过以下查询获取此数据并将 search_term 设置为“面孔” , "面罩", "面具" 和 "面罩"。
{
"query": {
"bool": {
"must": [{
"multi_match": {
"query": ${search_term},
"fields": [
"title^4",
"titleNgram^3",
],
"fuzziness": "auto"
}
}]
}
}
}
我无法实现的是,当我查询 "facemask"(search_term 中没有空格)时,它没有 return 任何文档包含 “face” 或 “mask”,但是,returns 文档的字段包含 “facewash” 。有办法实现吗?
映射分享如下
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text"
},
"titleNgram": {
"search_analyzer": "whitespace_analyzer",
"analyzer": "nGram_analyzer",
"type": "text"
},
"id": {
"index": false,
"type": "text"
}
}
}
}
}
您可以尝试删除 "search_analyzer": "whitespace_analyzer",
并重新索引数据并使用相同的查询,它应该 return 您会得到预期的结果。
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text"
},
"titleNgram": {
"search_analyzer": "whitespace_analyzer", --> remove this line.
"analyzer": "nGram_analyzer",
"type": "text"
},
"id": {
"index": false,
"type": "text"
}
}
}
}
}
编辑:我在本地测试过它对我有用,下面是我使用的示例
搜索查询
{
"query": {
"multi_match": {
"query": "face mask",
"fields": [
"titlengram",
"title"
]
}
}
}
它给出了你期望的文档
"hits": [
{
"_index": "ngram",
"_type": "_doc",
"_id": "1",
"_score": 2.3014567,
"_source": {
"title": "face mask",
"titlengram": "face mask"
}
}
我在包含 “面罩” 的 elasticsearch 字段中有数据,我可以通过以下查询获取此数据并将 search_term 设置为“面孔” , "面罩", "面具" 和 "面罩"。
{
"query": {
"bool": {
"must": [{
"multi_match": {
"query": ${search_term},
"fields": [
"title^4",
"titleNgram^3",
],
"fuzziness": "auto"
}
}]
}
}
}
我无法实现的是,当我查询 "facemask"(search_term 中没有空格)时,它没有 return 任何文档包含 “face” 或 “mask”,但是,returns 文档的字段包含 “facewash” 。有办法实现吗?
映射分享如下
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text"
},
"titleNgram": {
"search_analyzer": "whitespace_analyzer",
"analyzer": "nGram_analyzer",
"type": "text"
},
"id": {
"index": false,
"type": "text"
}
}
}
}
}
您可以尝试删除 "search_analyzer": "whitespace_analyzer",
并重新索引数据并使用相同的查询,它应该 return 您会得到预期的结果。
{
"mappings": {
"_doc": {
"properties": {
"title": {
"type": "text"
},
"titleNgram": {
"search_analyzer": "whitespace_analyzer", --> remove this line.
"analyzer": "nGram_analyzer",
"type": "text"
},
"id": {
"index": false,
"type": "text"
}
}
}
}
}
编辑:我在本地测试过它对我有用,下面是我使用的示例
搜索查询
{
"query": {
"multi_match": {
"query": "face mask",
"fields": [
"titlengram",
"title"
]
}
}
}
它给出了你期望的文档
"hits": [
{
"_index": "ngram",
"_type": "_doc",
"_id": "1",
"_score": 2.3014567,
"_source": {
"title": "face mask",
"titlengram": "face mask"
}
}