Elasticsearch - 如果发出的令牌为空,则分析器中的默认令牌

问题描述 投票:0回答:1

要求是 - 当在 Elasticsearch 索引上触发搜索查询时,我们构建了一个大型 Elastic Query DSL 查询来在索引上运行搜索。

对于其中一个属性字段,我们应用了自定义分析器。

分析器中使用的过滤器之一是同义词翻译器,它根据输入字符串/标记生成 4 个预期标记之一。

如果没有匹配的内容,有没有办法测试发出的令牌是否为空 - 然后将“typeA”设置为默认输出令牌?

如果输入文本没有与映射匹配的同义词,那么我只得到空标记数组。但我需要将其放在 Must[] 块中(即,此 CustomTypeAnalyzer 应用于必须查询块中使用的查询中的属性。

所以它不能为空,我需要分析器发出一个默认令牌,如果我选择的默认令牌是“typeA”,那么只有在 CustomTranlator 没有产生任何令牌时,我才需要我的分析器发出默认令牌。

我该怎么做?

我尝试了条件过滤器,但这似乎也只能对输入标记进行操作。

我基本上需要能够测试发出的令牌是否为空。

我无法运行多个查询(首先分析器 api,然后搜索 api 等不可能/不可行),我的查询构建器将运行并在索引上触发一个搜索查询。

所以我希望我的自定义分析器本身能够有条件地发出默认令牌如果发出的令牌为空

问候, 苏曼斯

我的自定义分析仪是这样的

“我的自定义类型分析器”:{ “筛选” : [ “EngStopWordsRemover”, “小写”, “EngStemmer”, “自定义翻译器”, “空间令牌移除器”, “独特的” ], “标记器”:“标准” }

自定义翻译器是这样的

“自定义翻译器”:{ “类型”:“同义词”, “同义词”:[ “自愿,自愿,芯片,注册=>类型A”, “节目,事件,参与,partak,注册=> typeB”, “贡献、捐赠、捐助者、给予、提供、赞助、资金、筹集、资金、支持 => typeC”, “征募、关联、注册、加入、成员、会员资格、注册 => typeD”, ] }

  1. 对于像“我想花一些时间教孩子”这样的输入字符串 - 然后我得到空标记。

  2. 对于输入字符串“我想参加教学活动”会发出标记“typeD

我希望能够测试分析器发出的令牌大小,并有条件地发出默认令牌typeA,但这必须内置到分析器本身中

elasticsearch full-text-search querydsl
1个回答
0
投票

你的问题不清楚。我希望我的解决方案适合您

使用您的

synonym
过滤器和我的条件
pattern
过滤器进行映射,以将未同义词的标记替换为默认标记“typeA”

PUT /token_replace
{
    "settings": {
        "analysis": {
            "analyzer": {
                "replacing_token_analyzer": {
                    "tokenizer": "standard",
                    "filter": [
                        "typead_synonym_filter",
                        "conditional_replacer_filter"
                    ]
                }
            },
            "filter": {
                "typead_synonym_filter": {
                    "type": "synonym",
                    "synonyms": [
                        "volunt,voluntari,chip,regist => typeA",
                        "program,event,particip,partak,regist => typeB",
                        "contribut,donat,donor,give,provid,sponsor,fund,raise,money,support => typeC",
                        "enlist,associat,enrol,join,member,membership,regist => typeD"
                    ]
                },
                "conditional_replacer_filter": {
                    "type": "pattern_replace",
                    "pattern": "(.++)(?<!\\btype[A-D])",
                    "replacement": "typeA"
                }
            }
        }
    }
}

typeA 的同义词对没有意义。所有未替换的令牌均替换为“typeA”

您的第一条短信

GET /token_replace/_analyze?filter_path=tokens.token
{
    "analyzer": "replacing_token_analyzer",
    "text": "I would like to spend some time teaching kids"
}

回应

{
    "tokens" : [
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        }
    ]
}

您的第二条短信

GET /token_replace/_analyze?filter_path=tokens.token
{
    "analyzer": "replacing_token_analyzer",
    "text": "I would like to join a teaching activity"
}

回应

{
    "tokens" : [
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeD"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        },
        {
            "token" : "typeA"
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.