我有以下数据集:
{
"_index": "myIndex",
"_type": "myType",
"_id": "220005",
"_score": 1,
"_source": {
"id": "220005",
"name": "Some Name",
"type": "myDataType",
"doc_as_upsert": true
}
}
像这样进行直接匹配查询:
GET typo3data/destination/_search
{
"query": {
"match": {
"name": "Some Name"
}
},
"size": 500
}
将返回数据就好了:
"hits": {
"total": 1,
"max_score": 3.442347,
"hits": [...
然后进行OR查询(我不确定哪种语法是正确的,第一种语法来自elasticsearch docs,第二种语法来自另一个具有相同版本的项目):
GET typo3data/destination/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"or": {
"filters": [
{
"term": {
"name": "Some Name"
}
}
]
}
}
}
},
"size": 500
}
或
{
"query":
{
"match_all": {}
},
"filter":
{
"or":
[
{ "term": { "name": "Some Name"} },
{ "term": { "name": "Some Other Name"} }
]
},
"size": 1000
}
不返回任何内容。
名称字段的映射是:
"name": {
"type": "string",
"index": "not_analyzed"
}
Elasticsearch版本是1.4.4。
答案 0 :(得分:0)
在扩展我们的映射以包含我们拥有的每个字段后:
PUT typo3data/_mapping/destination
{
"someType": {
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string",
"index": "not_analyzed"
},
"parentId": {
"type": "integer"
},
"type": {
"type": "string"
},
"generatedUid": {
"type": "integer"
}
}
}
}
or-filters正在运行。所以一般的答案是:如果你遇到这样的问题,请仔细检查你的映射,而不要做太多的工作。
如果有人解释为什么会发生这种情况,我很乐意将答案标记传递给它。
答案 1 :(得分:0)
索引“某个名称”时,会将其分为以下标记 -
"some name" => [ "some" , "name" ]
现在在正常匹配查询中,它在匹配结果之前也执行相同的上述过程。如果存在“相同”或“名称”,则该文档被视为结果
match query ("some name") => search for term "some" or "name"
术语查询不会分析或标记您的查询。这意味着它会查找不存在的“某个名称”的确切令牌或术语。
term query ("some name") => search for term "some name"
因此你不会看到任何结果。 如果你使字段not_analyzed,事情应该工作正常,但然后确保案例也匹配, 您可以阅读有关相同here的更多信息。