2013-11-11 3 views
6

Я делаю поиск текста через ElasticSearch, и есть проблема с запросом с типом термина. То, что я делаю ниже, в основном,Поддерживает ли ElasticSearch Unicode/Chinese?

  1. Добавить документ с китайской струной (你好).
  2. Выполнение запроса текстовым методом и возврат документа.
  3. Запрос с помощью метода терминов, ничего не возвращайте.

Итак, почему это происходит? и как его решить.

➜ curl -XPOST 'http://localhost:9200/test/test/' -d '{ "name" : "你好" }' 

{ 
    "ok": true, 
    "_index": "test", 
    "_type": "test", 
    "_id": "VdV8K26-QyiSCvDrUN00Nw", 
    "_version": 1 
} 

➜ curl -XGET 'http://localhost:9200/test/test/_mapping?pretty=1' 

{ 
    "test" : { 
    "properties" : { 
     "name" : { 
     "type" : "string" 
     } 
    } 
    } 
} 

➜ curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' 

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 1.0, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "VdV8K26-QyiSCvDrUN00Nw", 
     "_score": 1.0, 
     "_source": { 
      "name": "你好" 
     } 
     } 
    ] 
    } 
} 

➜ curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' -d '{ 
    "query": { 
    "text": { 
     "name": "你好" 
    } 
    } 
}' 

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 0.8838835, 
    "hits": [ 
     { 
     "_index": "test", 
     "_type": "test", 
     "_id": "VdV8K26-QyiSCvDrUN00Nw", 
     "_score": 0.8838835, 
     "_source": { 
      "name": "你好" 
     } 
     } 
    ] 
    } 
} 

➜ curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' -d '{ 
    "query": { 
    "term": { 
     "name": "你好" 
    } 
    } 
}' 

{ 
    "took" : 2, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 5, 
    "successful" : 5, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 0, 
    "max_score" : null, 
    "hits" : [ ] 
    } 
} 

ответ

6

Из документов ElasticSearch о term query:

Матчей документы, которые имеют поля, содержащие термин (не анализировались).

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

curl -XGET 'http://localhost:9200/test/test/_search?pretty=1' -d '{"query" : {"term" : { "name" : "好" }}}' 

Его, потому что каждый маркер представляет собой не анализировались термин по этому вопросу. Если вы указали документ с именем «你 好吗», вы также не найдете документы, содержащие «好吗» или «你好», но вы можете найти документы, содержащие «你», «好» или «吗», термин запрос.

Для китайцев вам, возможно, потребуется обратить особое внимание на используемый анализатор. Для меня стандартный анализатор кажется достаточно хорошим, хотя (символизирует китайские фразы по характеру по характеру, а не по пространству).

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