2015-08-12 3 views

ответ

1

Существуют различные способы, но один из способов будет объявить строку как not_analyzed в вашем отображении (см ниже), а затем искать точное значение, которое было проиндексирована.

curl -XPUT localhost:9200/tests -d '{ 
    "mappings": { 
    "test": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "fields": { 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     } 
    } 
    } 
}' 

Теперь мы индексировать образец документа:

curl -XPUT localhost:9200/tests/test/1 -d '{"name":"procter & gamble"}' 

И, наконец, ваш поисковый запрос будет возвращать документ, который вы ожидаете:

curl -XGET localhost:9200/tests/test/_search?q=name.raw:"procter %26 gamble" 

UPDATE Вот еще один сложнее путь используя nGram tokenizer, который будет индексировать все возможные маркеры длиной от 2 до 20 (произвольный выбор) ваших имен.

curl -XPUT localhost:9200/tests -d '{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "ngram_analyzer": { 
      "tokenizer": "ngram_tokenizer", 
      "filter": [ 
      "lowercase" 
      ] 
     } 
     }, 
     "tokenizer": { 
     "ngram_tokenizer": { 
      "type": "nGram", 
      "min_gram": 2, 
      "max_gram": 20 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "test": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "index_analyzer": "ngram_analyzer", 
      "search_analyzer": "keyword" 
     } 
     } 
    } 
    } 
}' 

Тогда вы можете найти точное название, как и раньше

curl -XGET localhost:9200/tests/test/_search?q=name:"procter %26 gamble" 

Или просто какой-то знак присутствует в вашем имени

curl -XGET localhost:9200/tests/test/_search?q=name:procter 
curl -XGET localhost:9200/tests/test/_search?q=name:"procter %26" 
curl -XGET localhost:9200/tests/test/_search?q=name:gamble 
+0

Я предполагаю, что это работает; однако я хотел бы найти документ для частичного имени, например, «procter», поэтому мне нужно, чтобы это поле было проанализировано. Чтобы избежать «если не найдено в name_analyzed, search in name_raw» логики, вы могли бы поделиться другими способами, о которых вы упомянули? – avj

+0

Да, у меня точно есть nGram, а в то время как полный запрос имени (q = name: "procter% 26 gamble"), а также частичный без амперсанда (q = name: procter) работает, проблема в том, что частичная с амперсандом (GET/tests/test/_search? q = name: "procter% 26") нет. – avj

+0

Я обновил отображение и добавил вместо этого ключевое слово 'search_analyzer'. Это делает трюк. Попробуйте. – Val