我用PHP创建了一个小应用程序,并使用ES。我的要求是好的,但我得到了好的结果。我的请求看起来是这样的:
link:9200/index/_search?from=0&size=130&q=try:'yes‘%2 2Bbrand:’BMW‘%2Bmodel:’意甲5‘%2 2Bprice:500到700000
当我发送这个查询时,我们会回复我的模型‘意甲3’和‘意甲5',这是很棒的,但当我发送这个查询时,我只想恢复’宝马‘和’意甲5‘。
我怎么才能解决这个问题?
发布于 2014-08-19 13:21:14
首先,您应该查看文档,以便更熟悉这些概念(analyze / 查询和筛选器的区别),这些概念对于很好地使用ElasticSearch非常重要。您可以找到一个很好的入门文档这里。
您的问题是您的“模型”字段是一个字符串,默认情况下使用标准分析器进行分析。
它输出2个令牌,因为模型名称中有空格,您可以看到如果使用_analyze端点:
GET _analyze?analyzer=standard&text='Serie 5'
{
"tokens": [
{
"token": "serie",
"start_offset": 1,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "5",
"start_offset": 7,
"end_offset": 8,
"type": "<NUM>",
"position": 2
}
]
}最重要的是,您使用的是一个查询,但它将返回与匹配的所有结果,甚至部分。所以,你的结果中肯定有这两辆车,但“意甲5级”赛车肯定是第一辆(因为它匹配得更好),而不是“3号级”,后者用一个更高的_score属性来表示。
您需要使用一个项过滤器,它只返回包含您提供的术语值的文档。但是,由于它是在条件上工作的,您必须将字段的映射更改为"not_analyzed“,这样才能保持原样:
PUT /test/car/_mapping
{
"properties":{
"model":{
"type": "string",
"index":"not_analyzed"
}
}
}最后,搜索请求将类似于这样(价格标准为距离滤波器,并使用和过滤器将两者结合在一起):
GET /test/car/_search
{
"query": {
"filtered": {
"filter": {
"and": {
"filters": [
{
"term": {
"model": "Serie 3"
}
},
{
"range": {
"price": {
"from": 500,
"to": 70000
}
}
}
]
}
}
}
}
}https://stackoverflow.com/questions/25381429
复制相似问题