1

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}"
                            }
                        }
                 }
              }

        }
4

1 回答 1

1

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

但是在您的评论中,您提到要搜索包含PFT11473.1with search queryPFT11473的文档,您需要为此创建另一个将替换.为 space的分析器,以便生成 2 个令牌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"
            ]
        }
    }
}
于 2019-09-06T05:53:01.303 回答