【问题标题】:Using wildcards in phrases with Elasticsearch Query String Query在带有 Elasticsearch 查询字符串查询的短语中使用通配符
【发布时间】:2021-07-21 20:15:35
【问题描述】:

使用通配符,我可以匹配以某个值开头的词:

{
    "query": {
        "query_string" : {
            "query" : "subject:cell*"
        }
    }
}

这里的subject 字段是keyword 字段(未分析)。这很好用,但我不知道如何找到以“蜂窝控制”开头的术语。尝试双引号并没有产生预期的结果:

{
    "query": {
        "query_string" : {
            "query" : "subject:\"cellular contr*\""
        }
    }
}

注意:短语搜索适用于完全匹配,但不适用于通配符。我的猜测是星号不会被解释为双引号内的通配符运算符。那是对的吗?还有没有其他方法可以在短语中使用通配符运算符?

注意:我必须使用Query String Query,因为查询来自用户输入。

(我知道我可以使用正则表达式,但我不想这样做)

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    除了 Hemed 指出的自定义分析器之外,您还需要进行如下搜索 -

    {
        "query": {
            "query_string" : {
                "query" : "subject:cellular\\ contr*"
            }
        }
    }
    

    经过大量研究和尝试找到它!

    【讨论】:

    • 感谢您的提示! “\\” 告诉 elastic 它是短语中的一个空格,您可以(或必须)省略搜索字符串的引号。
    【解决方案2】:

    编辑: 定义用于搜索的自定义分析器:-

    settings:
       index:
         analysis:
           analyzer:
             keyword_analyzer:
               type: custom
               tokenizer: keyword
               filter:
                 - lowercase
    

    发现在这种情况下你需要使用Prefix Query,因为Query String Query在解析过程中总是在空格上分段。

    但由于您在此字段中使用lowecase filter 并且前缀查询不支持分析器,因此您必须在将用户输入附加到查询之前将其小写。

    新查询变为:-

       {
            "query": {
                "prefix" : {
                    "subject" : "cellular contr"
                }
            }
        }
    

    或者,您可以使用支持分析器的Match Phrase Query

    {
        "query": {
            "match_phrase_prefix" : {
                "subject" : {
                     "query" : "Cellular contr",
                      "analyzer" : "keyword_analyzer",
                      "max_expansions" : 100
                     }
                  }
             }
        }
    

    【讨论】:

    • 如果我不需要词组查询就可以了。但我不希望查询“细胞控制 *”匹配,例如“细胞材料的控制”,这就是为什么我将该字段索引为 keyword
    • 我想我误解了你的问题。您想搜索查询字符串“细胞控制”并在subject 类型为keyword 的字段not analyzed 中获得“细胞材料控制”的结果是否正确?
    • 不,如果我搜索“细胞控制”,我希望它匹配“细胞控制”,而不是“细胞材料控制”。所以我真正想要的是subject:/cellular contr.*/,但不使用正则表达式。
    • 请看我的编辑。我认为您在此特定字段中搜索时必须指定自定义搜索分析器。
    • 似乎给出了完全相同的结果。可能仍被解释为(subject:cellular) OR (contr*)
    【解决方案3】:

    试试这个:

    {
        "query": {
            "query_string" : {
                "query" : "subject:"cellular contr*",
                "split_on_whitespace" : false
            }
        }
    }
    

    【讨论】:

    • 默认值为false,因此将其显式设置为 false 应该没有任何区别。但我尝试以防万一,它被解释为“(主题:蜂窝)或(contr *)”,而不是我想要的。我也尝试过使用analyze_wildcardauto_generate_phrase_queries,但没有成功(不过,文档对他们所做的事情有点薄)
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2017-12-14
    相关资源
    最近更新 更多