2014-02-12 1 views
15

Отдельно, у меня есть частичный поиск, и я могу искать все поля. Но я не могу использовать частичное сопоставление при поиске, который отображает все поля.Создание запроса ElasticSearch для поиска всех полей и одновременного использования частичного совпадения

Это возвращает мое имя, когда я использую частичное соответствие:

GET /_search?pretty=true 
{ 
    "query": { 
     "match": { 
      "FullName": "andon" 
     } 
    } 
} 

Этот поиск работает на всех полях, но не делает частичного соответствия (0 хитов):

GET /_search?pretty=true 
{ 
    "query": { 
     "match": { 
      "_all": "andon" 
     } 
    } 
} 

Что я нужно сделать, чтобы совместить частичное совпадение с поиском по всем полям & типов? У меня много полей и типов, поэтому я надеюсь не указывать их вручную.

Если это имеет значение, я вставляю свои данные из реки, которая подключается к SQL.

EDIT: Теперь у меня есть поле _all в моем сопоставлении. Кажется, не имеет значения.

PUT /contact/ 
{ 
    "settings" : { 
     "index" : { 
      "analysis" : { 
       "analyzer" : { 
        "my_ngram_analyzer" : { 
         "tokenizer" : "my_ngram_tokenizer" 
        } 
       }, 
       "tokenizer" : { 
        "my_ngram_tokenizer" : { 
         "type" : "nGram", 
         "min_gram" : "1", 
         "max_gram" : "10" 
        } 
       } 
      } 
     } 
    }, 
    "mappings": { 
     "_default_": { 
      "_all" : {"enabled" : true}, 
      "properties" : { 
       "Description":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "OfficePhone":{"type":"string","store":"yes"}, 
       "Email":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "FullName":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "ReportsTo":{"type":"string","store":"yes"}, 
       "Department":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"}, 
       "Title":{"type":"string","store":"yes", "index_analyzer": "my_ngram_analyzer"} 
      } 
     } 
    } 
} 
+0

У вас есть ' "_all": { "enabled": true} 'в вашем сопоставлении? см. http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-all-field.html –

+0

@maxivanov Я этого не делал, но сейчас. Посмотрите мое редактирование – Brandon

+0

Можете ли вы воспроизвести его? Я просто не могу: https://gist.github.com/maximivanov/8958787 –

ответ

23

В _all-field работает, принимая текст для всех полей, передать их через анализатор для _all (который standard если переопределяется), то индекс результирующие сроки.

Это не принимает любые условия, сделанные анализаторами для других полей, и вталкивает их все в одно и то же поле.

Таким образом, вам необходимо переопределить поле _all, чтобы использовать свой пользовательский анализатор.

Но! Я не думаю, что ты действительно хочешь это сделать. Вы получите гораздо больший индекс. Иногда _all удобен, но обычно лучше контролировать, какие поля ищутся во время поиска.

Так что вместо того, чтобы делать match на _all, вы, вероятно, захотите использовать multi_match, указав свои поля. Вы также можете рассмотреть copy_to, если вы в 1.0.

+0

Я обновил до 1.0. Функция copy_to именно то, что я искал. Я создал новое поле, в котором я использовал анализатор ngram, и я просто скопировал все поля, которые я хотел в нем. – Brandon

1

Я попытался найти с символами подстановки (% 2A) и был в состоянии сделать частичный поиск

ех => д = жуют% 2A & размер = 100

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