0

我正在尝试在搜索中匹配“纽约”(不是分别包含“新”或“约克”的地方)

这是我当前的查询:

"query" : {                        
    "query_string" : {            
        "query" : "new york" ,
        "fields" : ["city"]
    }
},
"filter" : {
    "and" : [{
        "query" : {                 
            "query_string" : {                    
                "query" : "country:US"               
             }            
        }
    }]
}               

但是,这会不断返回名为“york”而不是“new york”的地方

我不完全理解它是如何工作的,并且希望能得到一些帮助以使其真正为我工作。

4

2 回答 2

3

如果您希望两个单词出现在同一个文档中,则需要更改默认运算符,如下所示:

"query" : {                        
    "query_string" : {            
        "query" : "new york" ,
        "fields" : ["city"],
        "default_operator" : "AND"
    }
}

或在查询中指定它:

"query" : {                        
    "query_string" : {            
        "query" : "new AND york" ,
        "fields" : ["city"]
    }
}

查看查询字符串文档。

否则,如果您希望两个单词在同一个文档中彼此靠近,则需要进行如下的短语查询

"query" : {
    "match_phrase" : {
        "message" : "new york"
    }
}
于 2012-11-21T13:37:59.940 回答
0

默认情况下,Elasticsearch“分析”中的城市字段对单词进行默认标记化。

New York => *New*, *York*

为了保持令牌完整(主要用于聚合),您需要使用多字段显式使城市字段“未分析”

'city' => [
            'type' => 'string',
            'fields' => [
            'raw' => [
              'type'  => 'string',
              'index' => 'not_analyzed'
              ]
            ]
        ]

现在您可以使用city.raw来获取未分析的值。

于 2016-03-21T12:37:15.820 回答