Elasticsearch术语与空格

时间:2018-03-19 10:25:00

标签: elasticsearch

我有一个他们对ElasticSearch感兴趣的用户列表:

这是我的映射:

      mappings: {
        users: {
          properties: {
            username: {
              type: 'text',
              analyzer: 'autocomplete',
              search_analyzer: 'autocomplete'
            },
            interests: {
              type: 'text'
            },
            locations: {
              type: 'text'
            },
            roles: {
              type: 'text'
            }
          }
        }
      },
      settings: {
        analysis: {
          analyzer: {
            autocomplete: {
              type: 'custom',
              tokenizer: 'autocomplete',
              filter: ['lowercase']
            }
          },
          tokenizer: {
            autocomplete: {
              type: 'edge_ngram',
              min_gram: 3,
              max_gram: 10,
              token_chars: [
                'letter', 'digit'
              ]
            }
          }
        }
      }

这是一个示例文档:

  {
   "_index": "users",
   "_type": "users",
   "_id": "4",
   "_score": 1.0,
   "_source": {
     "username": null,
     "interests": [
       "live events"
     ],
     "locations": [
       "abington",
       "connecticut"
     ],
     "roles": [

     ]
   }
 }

现在我搜索:

{
  terms: ["live events"]
}

我没有结果。我检查过,如果该术语包含space,则会发生这种情况。我的猜测是条款会查找完全匹配,但我无法理解这里发生了什么。

1 个答案:

答案 0 :(得分:4)

您应该仅对关键字数据类型使用term/terms查询。在您的情况下,您正在查询带有text datatype的字段,如映射中所示:

    interests: {
      type: 'text'
    }

在这种情况下,您必须使用匹配查询,所以:

{
    "query": {
        "match" : {
            "interests" : "live events"
        }
    }
}