如何在Elasticsearch分析器中包含虚线词?

How to include dotted words in Elasticsearch analyzer?

提问人:Sandy 提问时间:6/28/2022 最后编辑:Sandy 更新时间:6/30/2022 访问量:108

问:

我正在使用此分析仪

"settings": {
    "analysis": {
        "char_filter": {
            "my_char_filter": {
                "type": "mapping",
                "mappings": [
                    "- => _",
                ]
            },
            "quote_filter": {
                "type": "mapping",
                "mappings": [
                    "\\u0091=>\\u0020",
                    "\\u0092=>\\u0020",
                ]
            }
        },
        "analyzer": {
            "my_analyzer": {
                "tokenizer": "standard",
                "char_filter": [
                    "my_char_filter", "quote_filter"
                ],
                "filter": [
                    "lowercase",
                ]
            }
        }
    }
}

在此映射中:

"mappings": {
    "properties": {
        "title": {
            "type": "text",
            "analyzer": "my_analyzer",
            "term_vector": "with_positions_offsets",
        },
        "description": {
            "type": "text",
            "analyzer": "my_analyzer",
            "term_vector": "with_positions_offsets",
            "fielddata": True
        },
    }
}

一切都适用于简单的关键字。

所以,如果我使用这个查询

{
    "query":
    {
        "bool":
        {
            "must":
            [
                {
                    "query_string":
                    {
                        "query": "\".net\" OR \".com\"",
                        "fields":
                        [
                            "title",
                            "description"
                        ]
                    }
                }
            ]
        }
    },
    "highlight":
    {
        "pre_tags":
        [
            "<match>"
        ],
        "post_tags":
        [
            "</match>"
        ],
        "fields":
        {
            "title":
            {
                "type": "fvh",
                "number_of_fragments": 0
            },
            "description":
            {
                "type": "fvh",
                "number_of_fragments": 0
            }
        }
    }
}

在以下描述中搜索“.com”“Google.com 是一家专注于人工智能、搜索引擎技术、在线广告、云计算和计算机软件的美国跨国科技公司 (COM)”,它只匹配“COM”(括号内)而不是“.com”。

我该如何解决这个问题?

编辑:我发现查询:

"query_string" : {
    "query" : ".com OR .net OR Engine OR American" # by removing '\"'
    "fields": ["title","description"],
}

部分工作,因为它机器“引擎”和“美国”,但我不知道是否匹配“.com”或“.net”(人眼显然可以),因为查询响应给了我:

matched_keywords: {'Engine', 'American', 'Google.com'}

那么,怎么能有这样的东西

matched_keywords: {'Engine', 'American', '*.com'} 

?

弹性搜索 elasticsearch-dsl elasticsearch-analyzers

评论

0赞 Amit 7/13/2022
你还面临这个问题吗?

答:

1赞 rabbitbr 6/29/2022 #1

这是因为您拥有的最接近的令牌是“google.com”,在您的情况下,通配符可以解决它,但您将失去性能。

{
          "wildcard": {
            "description": {
              "value": "*.com"
            }
          }
        }

评论

0赞 Sandy 6/30/2022
我不想使用通配符,因为我也使用确切的词,例如 google、yahoo 等。我的查询应该像“.com”或“Google”或“引擎”,但是此查询中的.com无法正常工作。
0赞 Sandy 6/30/2022
我更新了我的答案,考虑了一下
0赞 rabbitbr 6/30/2022
分析器正在删除“.”。运行 GET index_name/_analyzer 查看。生成的令牌是“google.com”,因此它不仅适用于“.com”。