我在Ubuntu 16.04上使用ElasticSearch 5.6。我的问题是当我尝试在具有多个单词的邻近搜索中使用通配符时。
示例:
"hell* worl*"~3
基本上,我想得到所有以“地狱”和“世界”开头的单词,彼此接近,最大距离为3。
我没有收到任何错误,但找不到文件。似乎没有分析通配符。我也设置了analyze_wildcard: true
DOC说:
默认情况下,不分析查询字符串中的通配符。通过 将此值设置为true,将尽最大努力进行分析 那些。
但是,只有以下查询有效:
"hello world"~3 # this works
这是我的疑问:
{
"size":15,
"from":0,
"query":{
"bool":{
"must":[
{
"query_string":{
"query":"\"hell* worl*\"~3",
"analyze_wildcard":true
}
}
]
}
}
}
参考:
答案 0 :(得分:3)
您可以使用span queries来获得您想要的内容,但要小心,因为这里不会分析这些条款。
{
"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
}
}
}
query_string
中的问题是*
字符在引号内不被视为通配符。你得到的是类似于"hell# worl#"~3
的简单slop短语,因为特殊字符在引号内没有意义。
但要小心,因为跨度查询的性能比简单的短语搜索慢得多(尽管它似乎仍然是faster而不是slop phrases,这实际上让我感到惊讶。)
如果您仍然可以为场景准备数据,那么更好的选择就是使用ngrams。使用ngrams简单"hell worl"~3
可以匹配你想要的。