我在 Ubuntu 16.04 上使用 ElasticSearch 5.6。我的问题是当我尝试在包含多个单词的邻近搜索中使用通配符时。
例子:
"hell* worl*"~3
Run Code Online (Sandbox Code Playgroud)
基本上,我想得到所有以“hell”和“worl”开头的单词,它们彼此靠近,最大距离为 3。
我没有收到任何错误,但它没有找到文件。好像没有分析通配符。我也设置了analyze_wildcard: true
DOC 说:
默认情况下,不分析查询字符串中的通配符术语。通过将此值设置为 true,也将尽最大努力分析这些值。
但是,只有以下查询有效:
"hello world"~3 # this works
Run Code Online (Sandbox Code Playgroud)
这是我的查询:
{
"size":15,
"from":0,
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"\"hell* worl*\"~3",
"analyze_wildcard":true
}
}
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
参考:
您可以使用跨度查询来实现您想要的,但要小心,因为这里没有分析这些术语。
{
"size": 15,
"from": 0,
"query": {
"span_near": {
"clauses": [
{
"span_multi": {
"match": {
"wildcard": {
"t": "hell*"
}
}
}
},
{
"span_multi": {
"match": {
"wildcard": {
"t": "worl*"
}
}
}
}
],
"slop": 3,
"in_order": true
}
}
}
Run Code Online (Sandbox Code Playgroud)
您的问题query_string是*字符在引号内不被视为通配符。你得到的是简单的废话短语,类似于"hell# worl#"~3引起特殊字符在引号内没有意义。
但是要小心,因为跨度查询的性能比简单的短语搜索慢得多(尽管它似乎仍然比实际上让我感到惊讶的草率短语快)。
如果您仍然可以为场景准备数据,更好的选择是使用 ngrams。使用 ngrams simple"hell worl"~3会匹配你想要的。
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |