我在使用查询字符串regex查询字段(标题)时遇到问题。
这有效:"标题:/ test /"
这不是:"标题:/ ^测试$ /"
我的目标是完全匹配,但这个匹配不应该是偏的,它应该与整个字段值匹配。
有人知道这里可能有什么问题吗?
答案 0 :(得分:3)
Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。
您正在使用不受支持的锚点^
和$
,因为不再需要它,再次来自文档
Lucene的模式总是固定不变的。提供的模式必须与整个字符串匹配
如果您正在寻找phrase query
种匹配,可以使用double quotes
这样的
{
"query": {
"query_string": {
"default_field": "title",
"query": "\"test phrase\""
}
}
}
但这也会匹配带有测试短语someword
等标题的文档如果您想要完全匹配,则应该查找term queries,将标题字段映射为"index" : "not_analyzed"
,或者将keyword analyzer与lowercase filter一起使用用于不区分大小写的匹配。您的查询将如下所示
{
"query": {
"term": {
"title": {
"value": "my title"
}
}
}
}
这将为您提供完全匹配
答案 1 :(得分:3)
通常在Regex中,^和$符号用于表示文本应位于字符串的开头/结尾。这称为锚定。 Lucene正则表达式模式默认为锚定。
所以模式"测试"与Elasticsearch相当于" ^ test $"用Java说。
你必须努力工作" unanchor"你的模式,例如使用" te。*"匹配"测试","测试"和#34;牙齿"。因为模式"测试"只会匹配"测试"。
请注意,这需要对字段进行分析,并注意它的性能非常糟糕。对于完全匹配,请使用ChintanShah25答案中描述的术语过滤器。