【问题标题】:Incorrect Results With Punctuation - ElasticSearch标点符号不正确的结果 - ElasticSearch
【发布时间】:2020-01-08 18:09:09
【问题描述】:

我有一个使用包含部件名称的 english 分析器索引的名称字段(也尝试了标准分析器)。

我的问题是我的一些标题包含标点符号,有些则没有。此外,我的一些查询包含标点符号,而有些则没有。

例如,我的标题为“CenterG 5.2 Drive Belt for model number 4425”。我的查询可能如下所示:“Centerg 5.2 皮带”,如果是这样,那么我的结果将正确显示,顶部显示“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}"
                            }
                        }
                 }
              }

        }

【问题讨论】:

  • 所以你想要的只是在你的文档中保留你的标点符号,这样当查询包含它们时,只有它们应该出现在结果中,否则不是吗?在这种情况下,请加粗您期望的 O/P 您想要哪个详细示例。
  • @AmitKhandelwal 我添加了更新。谢谢
  • 显示centerg 52 belt" 的结果会不会是错误的,因为标题包含5.2 而不是52,这是非常不同的?
  • 大多数情况下是的,但我处理的数据很糟糕,所以我试图最终忽略.。在某些情况下,某些型号可能不包含.,但查询可能也会产生奇怪的结果。我有很多型号可能更长的情况,例如PFT11473.1,我需要PFT114731 来匹配。
  • 7.3.感谢您的帮助。

标签: elasticsearch elasticsearch-rails


【解决方案1】:

仅使用 1 个字段和 1 个分析器很难实现这一点。如果您只使用自定义分析器,在索引时和查询时删除所有带有空格的点 .,则示例的第一部分很容易实现。

但是在您的评论中,您提到要使用搜索查询 PFT11473 搜索包含 PFT11473.1 的文档,为此您需要创建另一个分析器,将 . 替换为空格 ,这样 2生成令牌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"
            ]
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多