标点符号不正确的结果 - ElasticSearch
Incorrect Results With Punctuation - ElasticSearch
我有一个使用 english
分析器索引的名称字段,其中包含部件名称(也尝试过标准分析器)。
我的问题是有些标题包含标点符号,有些则没有。此外,我的一些查询包含标点符号,有些则没有。
例如我有标题"CenterG 5.2 Drive Belt for model number 4425"。我的查询可能如下所示:"Centerg 5.2 belt",如果是,那么我的结果会正确显示 "CenterG 5.2 Drive Belt for model number 4425" 在顶部。
但是,如果我的查询不包含标点符号,则该产品不会显示在结果中。对于不包含标点符号的标题和包含标点符号的查询,我有同样的问题。我不确定应该如何处理。我尝试使用 standard
分析器,据我所知,它忽略了标点符号,但这并没有改善结果。他们大致相同。
因此,当我搜索 "CenterG 5.2 Belt" 或 "centerg 52 belt" 时,我希望产品 "CenterG 5.2 Drive belt for model number 4425" 显示在结果的顶部。
这是我的映射:
{:properties=>{:name=>{:type=>"text", :analyzer=>"english"}}
我也尝试过利用 ngram 分析器,但没有解决这个问题。
这是我的查询:
{
query: {
bool: {
should:
{
multi_match:{
fields: ["name"],
query: "#{query}"
}
}
}
}
}
仅用 1 个字段和 1 个分析仪很难实现这一点。如果您只使用自定义分析器在索引时间和查询时间删除所有带空 space 的点 .
,则示例的第一部分很容易实现。
但是在您的评论中,您提到您想要使用搜索查询 PFT11473
搜索包含 PFT11473.1
的文档,为此您需要创建另一个分析器,将 .
替换为space </code>,这样就生成了 2 个标记 <code>PFT11473
和 1
,任何人都可以搜索。
我使用 2 个不同的分析器创建了 2 个字段来存储您的 title
字段,这些分析器服务于您提到的两个用例。
下面是索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"replace_dots"
]
},
"space_analyzer": {
"tokenizer": "standard",
"char_filter": [
"replace_dots_space"
]
}
},
"char_filter": {
"replace_dots": {
"type": "mapping",
"mappings": [
". =>"
]
},
"replace_dots_space": {
"type": "mapping",
"mappings": [
". => \u0020"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"analyzer": "my_analyzer",
"type": "text"
},
"title_space": {
"analyzer": "space_analyzer",
"type": "text"
}
}
}
}
这就是我索引一个示例文档的方式:
{
"title" : "PFT11473.1",
"title_space": "PFT11473.1"
}
最终搜索查询:
{
"query": {
"multi_match": {
"query": "PFT11473.1",
"fields": [
"title",
"title_space"
]
}
}
}
我有一个使用 english
分析器索引的名称字段,其中包含部件名称(也尝试过标准分析器)。
我的问题是有些标题包含标点符号,有些则没有。此外,我的一些查询包含标点符号,有些则没有。
例如我有标题"CenterG 5.2 Drive Belt for model number 4425"。我的查询可能如下所示:"Centerg 5.2 belt",如果是,那么我的结果会正确显示 "CenterG 5.2 Drive Belt for model number 4425" 在顶部。
但是,如果我的查询不包含标点符号,则该产品不会显示在结果中。对于不包含标点符号的标题和包含标点符号的查询,我有同样的问题。我不确定应该如何处理。我尝试使用 standard
分析器,据我所知,它忽略了标点符号,但这并没有改善结果。他们大致相同。
因此,当我搜索 "CenterG 5.2 Belt" 或 "centerg 52 belt" 时,我希望产品 "CenterG 5.2 Drive belt for model number 4425" 显示在结果的顶部。
这是我的映射:
{:properties=>{:name=>{:type=>"text", :analyzer=>"english"}}
我也尝试过利用 ngram 分析器,但没有解决这个问题。
这是我的查询:
{
query: {
bool: {
should:
{
multi_match:{
fields: ["name"],
query: "#{query}"
}
}
}
}
}
仅用 1 个字段和 1 个分析仪很难实现这一点。如果您只使用自定义分析器在索引时间和查询时间删除所有带空 space 的点 .
,则示例的第一部分很容易实现。
但是在您的评论中,您提到您想要使用搜索查询 PFT11473
搜索包含 PFT11473.1
的文档,为此您需要创建另一个分析器,将 .
替换为space </code>,这样就生成了 2 个标记 <code>PFT11473
和 1
,任何人都可以搜索。
我使用 2 个不同的分析器创建了 2 个字段来存储您的 title
字段,这些分析器服务于您提到的两个用例。
下面是索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"char_filter": [
"replace_dots"
]
},
"space_analyzer": {
"tokenizer": "standard",
"char_filter": [
"replace_dots_space"
]
}
},
"char_filter": {
"replace_dots": {
"type": "mapping",
"mappings": [
". =>"
]
},
"replace_dots_space": {
"type": "mapping",
"mappings": [
". => \u0020"
]
}
}
}
},
"mappings": {
"properties": {
"title": {
"analyzer": "my_analyzer",
"type": "text"
},
"title_space": {
"analyzer": "space_analyzer",
"type": "text"
}
}
}
}
这就是我索引一个示例文档的方式:
{
"title" : "PFT11473.1",
"title_space": "PFT11473.1"
}
最终搜索查询:
{
"query": {
"multi_match": {
"query": "PFT11473.1",
"fields": [
"title",
"title_space"
]
}
}
}