我遇到了带有空格的刻面标记化标记的问题。
我有以下映射:
curl -XPOST "http://localhost:9200/pictures" -d ' { "mappings" : { "pictures" : { "properties" : { "id": { "type": "string" }, "description": {"type": "string", "index": "not_analyzed"}, "featured": { "type": "boolean" }, "categories": { "type": "string", "index": "not_analyzed" }, "tags": { "type": "string", "index": "not_analyzed", "analyzer": "keyword" }, "created_at": { "type": "double" } } } } }'
我的数据是:
curl -X POST "http://localhost:9200/pictures/picture" -d '{ "picture": { "id": "4defe0ecf02a8724b8000047", "title": "Victoria Secret PhotoShoot", "description": "From France and Italy", "featured": true, "categories": [ "Fashion", "Girls", ], "tags": [ "girl", "photoshoot", "supermodel", "Victoria Secret" ], "created_at": 1405784416.04672 } }'
我的查询是:
curl -X POST "http://localhost:9200/pictures/_search?pretty=true" -d ' { "query": { "text": { "tags": { "query": "Victoria Secret" } } }, "facets": { "tags": { "terms": { "field": "tags" } } } }'
输出结果为:
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 0, "max_score" : null, "hits" : [ ] }, "facets" : { "tags" : { "_type" : "terms", "missing" : 0, "total" : 0, "other" : 0, "terms" : [ ] } } }
现在,我在方面得到0,而总数:0在命中
任何想法为什么它不起作用?
我知道当我从标签中删除关键字分析器并将其设为“not_analyzed”时,我会得到结果。
但仍存在区分大小写的问题
如果我通过删除 关键字分析器运行相同的上述查询,那么我得到的结果是:
facets: { tags: { _type: terms missing: 0 total: 12 other: 0 terms: [ { term: photoshoot count: 1 } { term: girl count: 1 } { term: Victoria Secret count: 1 } { term: supermodel count: 1 } ] } }
这里维多利亚秘密在“not_analyzed”中区分大小写,但在计数中占用空间,但当我用小写作为“维多利亚秘密”,它没有给出任何结果。
有什么建议吗?
谢谢,
苏拉杰
答案 0 :(得分:4)
第一个例子对我来说并不完全清楚。如果使用KeywordAnalyzer,则意味着该字段将按原样编制索引,但是根本不分析字段更有意义,这是相同的。您发布的地图包含
"index": "not_analyzed", "analyzer": "keyword"
这没有多大意义。如果您没有分析该领域,为什么会选择分析仪呢?
除此之外,当然如果您不分析字段,标记Victoria Secret
将按原样编入索引,因此查询victoria secret
将不匹配。如果您希望它不区分大小写,则需要定义使用custom analyzer的KeyworkTokenizer,因为您不想将其标记为LowercaseTokenFilter。您可以通过索引设置分析部分定义自定义分析器,然后在映射中使用它。但是那样的方面总是小写的,这是你不喜欢的东西。这就是为什么最好定义一个multi field并使用两个不同的文本分析索引该字段,一个用于构面,一个用于搜索。
您可以像这样创建索引:
curl -XPOST "http://localhost:9200/pictures" -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"lowercase_analyzer" : {
"type" : "custom",
"tokenizer" : "keyword",
"filter" : [ "lowercase"]
}
}
}
},
"mappings" : {
"pictures" : {
"properties" : {
"id": { "type": "string" },
"description": {"type": "string", "index": "not_analyzed"},
"featured": { "type": "boolean" },
"categories": { "type": "string", "index": "not_analyzed" },
"tags" : {
"type" : "multi_field",
"fields" : {
"tags": { "type": "string", "analyzer": "lowercase_analyzer" },
"facet": {"type": "string", "index": "not_analyzed"},
}
},
"created_at": { "type": "double" }
}
}
}
}'
然后,当您搜索该字段时,默认情况下,自定义lowercase_analyzer也会应用于文本查询,以便您可以搜索Victoria Secret
或victoria secret
并获取结果。您需要更改构面部分并在新的tags.facet
字段上创建构面,而不会对其进行分析。
此外,您可能希望查看match query,因为文本查询已被弃用最新的elasticsearch版本(0.19.9)。
答案 1 :(得分:0)
我认为这对我的回答有意义