2015-11-04 3 views
1

Я хочу сделать точные соответствия идентификаторов в поле doc. Я сопоставил поля для индексации их not_analyzed, но, похоже, в запросе каждый термин является токенизом или, по крайней мере, нижним. Как сделать запрос также not_analyzed? Используя ES 1.4.4, 1.5.1 и 2.0.0Как заставить запрос «условия» Elasticsearch быть not_analyzed

Вот документ:

{ 
    "_index": "index_1446662629384", 
    "_type": "docs", 
    "_id": "Cat-129700", 
    "_score": 1, 
    "_source": { 
     "similarids": [ 
      "Cat-129695", 
      "Cat-129699", 
      "Cat-129696" 
     ], 
     "id": "Cat-129700" 
    } 
} 

Вот запрос:

{ 
    "size": 10, 
    "query": { 
     "bool": { 
      "should": [{ 
       "terms": { 
        "similarids": ["Cat-129695","Cat-129699","Cat-129696"] 
       } 
      }] 
     } 
    } 
} 

Приведенный выше запрос не работает. Если я удаляю кепки и тире из идентификаторов doc, он работает. Я не могу сделать это по многим причинам. Есть ли способ сделать похожие объекты not_analyzed как поля doc?

ответ

1

Если вы правильно поняли, все, что вам нужно сделать, это установить "index":"not_analyzed" на в вашем картографировании. Если у вас уже есть эта настройка, тогда происходит что-то еще, что не очевидно из того, что вы опубликовали ("terms" query не делает никакого анализа на ваших условиях поиска). Вы можете проверить свое сопоставление, чтобы убедиться, что оно настроено так, как вы думаете.

Чтобы проверить это, я создал простой индекс, как это:

PUT /test_index 
{ 
    "settings": { 
     "number_of_shards": 1 
    }, 
    "mappings": { 
     "doc": { 
     "properties": { 
      "id": { 
       "type": "string", 
       "index": "not_analyzed" 
      }, 
      "similarids": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
     } 
     } 
    } 
} 

Затем добавили документ:

PUT /test_index/doc/1 
{ 
    "similarids": [ 
     "Cat-129695", 
     "Cat-129699", 
     "Cat-129696" 
    ], 
    "id": "Cat-129700" 
} 

И ваш запрос работает просто отлично.

POST /test_index/_search 
{ 
    "size": 10, 
    "query": { 
     "bool": { 
     "should": [ 
      { 
       "terms": { 
        "similarids": [ 
        "Cat-129695", 
        "Cat-129699", 
        "Cat-129696" 
        ] 
       } 
      } 
     ] 
     } 
    } 
} 
... 
{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
     "total": 1, 
     "successful": 1, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0.53148466, 
     "hits": [ 
     { 
      "_index": "test_index", 
      "_type": "doc", 
      "_id": "1", 
      "_score": 0.53148466, 
      "_source": { 
       "similarids": [ 
        "Cat-129695", 
        "Cat-129699", 
        "Cat-129696" 
       ], 
       "id": "Cat-129700" 
      } 
     } 
     ] 
    } 
} 

Я использовал здесь ES 2.0, но не имеет значения, какую версию вы используете. Вот код, который я использовал для теста:

http://sense.qbox.io/gist/562ccda28dfaed2717b43739696b88ea861ad690

+0

Да вы точно правильно. Я случайно отключил это сопоставление, поэтому я думал, что это было, но это не так. Спасибо – pferrel

+0

Эй, спасибо за смысл, очень круто! – pferrel

Смежные вопросы