2017-01-27 2 views
0

Мне нужна помощь в запросе поля в моем индексе. Это поле будет иметь такие данные, как:Запрос Elasticsearch

GB10
GB40
GB45
UK09
UK40

Если у меня есть запрос:

"Show me the code GB 40"

(обратите внимание на e пробел между GB и 40)

Я бы хотел, чтобы JSON вернул результат для GB40 в качестве верхнего результата. Может ли кто-нибудь помочь с тем, как я могу это сделать и какие изменения мне могут потребоваться? Я еще не определил поле как проанализированное.

+1

Не имеет никакого смысла, почему вы пытаетесь это сделать. – Adi

+0

Не могли бы вы объяснить свой случай использования? –

+0

, пожалуйста, покажите свой запрос и сопоставления, которые помогут вам сэкономить – user3775217

ответ

0

Хорошо, если у вас есть слова с таким рисунком, вы можете использовать split on letter-number transitions: "SD500" → "SD", "500" с использованием фильтра токенизатора word_delimiter.

Вы можете разбить слово на переписку с использованием этого фильтра, чтобы иметь как буквенную, так и цифровую часть слова, сохраненные отдельно на инвертированном индексе. Тем не менее, это также сохранит копию точной стоимости по индексу.

Пожалуйста, обратитесь отображения и запросов ниже

PUT testindex_48 
{ 
    "settings": { 
     "analysis": { 
      "analyzer": { 

       "word_delimiter_analyzer": { 
        "tokenizer": "whitespace", 
        "filter": [ 
         "lowercase", 
         "word_delimiter" 
        ], 
        "ignore_case": true, 
        "preserve_original": true 
       } 
      }, 
      "filter":{ 

      "word_delimiter":{ 
       "type":"word_delimiter", 
       "generate_word_parts":true, 
       "preserve_original": true 
      } 
     } 
     } 
    }, 
    "mappings": { 
     "table1": { 
      "properties": { 
       "title": { 
        "type": "string", 
        "analyzer": "word_delimiter_analyzer" 
       } 
      } 
     } 
    } 
} 

POST testindex_48/table1 
{ 
    "title" : "EC450" 
} 

POST testindex_48/table1/_search 
{ 
    "query": {"bool": {"must": [ 
    {"term": { 
     "title": { 
     "value": "450" 
     } 
    }} 
    ]}} 
} 

POST testindex_48/table1/_search 
{ 
    "query": {"bool": {"must": [ 
    {"term": { 
     "title": { 
     "value": "ec" 
     } 
    }} 
    ]}} 
} 


POST testindex_48/table1/_search 
{ 
    "query": {"bool": {"must": [ 
    {"term": { 
     "title": { 
     "value": "ec450" 
     } 
    }} 
    ]}} 
} 

Теперь ваш USECASE, если пользователь вводит «EC 450», вы можете создать подобный запрос как следует за.

+0

, спасибо, что это здорово, я проверю его. Еще одна вещь, чтобы сделать ее более запутанной, в том же поле, что и в mySQL db, могут быть данные, которые являются буквами, например aaabbb, где нет простого способа определить, как разбить его на отображение. Если пользователь должен был искать «aaa bbb» с пробелом, было бы просто использовать какое-то нечеткое соответствие для получения данных результата? Или есть лучший способ, которым я мог бы это сделать? – Chu

+0

, тогда я бы использовал n-грамматический токенизатор для токена всей строки, чтобы все было проще, а не погружаться в нечеткое соответствие. Https: //www.elastic.co/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer .html. спасибо – user3775217

+0

фантастический совет! Спасибо за помощь, я все проверил. – Chu

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