标点符号不正确的结果 - 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>PFT114731,任何人都可以搜索。

我使用 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"
            ]
        }
    }
}