Elasticsearch - 全文搜索

时间:2012-11-21 03:17:26

标签: php elasticsearch

我想在搜索中匹配“new york”(不是分别包含“new”或“york”的地方)

这是我当前的查询:

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

然而,这会让名为“york”的地方不再是“纽约”

我并不完全明白这是如何运作的,并希望能帮助我实现这一目标。

2 个答案:

答案 0 :(得分:3)

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

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

或在查询中指定:

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

查看query string文档。

否则,如果您希望两个单词在同一文档中彼此靠近显示,则需要制作phrase query,如下所示:

"query" : {
    "match_phrase" : {
        "message" : "new york"
    }
}

答案 1 :(得分:0)

默认情况下,城市字段在"分析"由Elasticsearch执行单词的默认标记化。

New York => *New*, *York*

为了保持令牌完整(主要用于聚合),您需要明确地制作城市字段"未分析"使用多字段

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

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