2016-10-28 5 views
0

В настоящее время я использую поиск эластичных изображений и имею несколько типов запросов, среди которых я использую запрос match_phrase. В индексе, который я использую это, используется английский анализатор для текстовых сообщений. Когда я ищу фразы, я ожидаю точных результатов, но если в моем поисковом термине есть английское слово - например remove, он также отмечает такие слова, как «удаленный», «удаление» «удаляет».Поиск по фразе в ElasticSearch с помощью анализатора английского языка

Как предотвратить это с помощью моей фразы? Есть ли лучший вариант, кроме match_phrase для запросов, подобных этому?

Возможно ли это без изменения анализатора? Ниже мой запрос (структурированы таким образом, что он может сделать другие вещи):

query: { 
    fields : ['_id', 'ownerId'], 
    from: 0, 
    size: 20, 
    query: { 
     filtered: { 
      filter: { 
       and: [group ids] 
      }, 
      query: { 
       bool: { 
        must: { 
         match_phrase: { 
           text: "remove" 
         } 
        } 
        } 
      } 
     } 
    } 
} 

А вот мой индекс:

[MappingTypes.MESSAGE]: { 
    properties: { 
     text: { 
     type: 'string', 
     index: 'analyzed', 
     analyzer: 'english', 
     term_vector: 'with_positions_offsets' 
     }, 
     ownerId: { 
     type: 'string', 
     index: 'not_analyzed', 
     store: true 
     }, 
     groupId: { 
     type: 'string', 
     index: 'not_analyzed', 
     store: true 
     }, 
     itemId: { 
     type: 'string', 
     index: 'not_analyzed', 
     store: true 
     }, 
     createdAt: { 
     type: 'date' 
     }, 
     editedAt: { 
     type: 'date' 
     }, 
     type: { 
     type: 'string', 
     index: 'not_analyzed' 
     } 
    } 
    } 
+0

Почему вы не можете просто сбросить английский анализатор в этом случае? – ChintanShah25

+0

Можно ли контролировать, какой анализатор используется только из запроса? Я пытаюсь сделать что-то вроде настройки «анализатора» на ключевое слово, но он просто терпит неудачу. С другой стороны, я также использую ES 1.5. –

+0

Мне удалось использовать ключевое слово - но мне нужно, чтобы мои данные были проиндексированы как ключевое слово, чтобы это действительно работало? Как бы то ни было, я не получаю никаких результатов. –

ответ

1

Вы можете использовать multi-fields использовать поле по-разному (один для точного соответствия и один для частичного совпадения и т. д.).

Вы можете избавиться от стебления с помощью standard analyzer, который также является анализатором по умолчанию. Вы можете создать свой индекс с следующим отображением

POST test_index 
{ 
    "mappings": { 
    "test_type": { 
     "properties": { 
     "text": { 
      "type": "string", 
      "index": "analyzed", 
      "analyzer": "english", 
      "term_vector": "with_positions_offsets", 
      "fields": { 
      "standard": { 
       "type": "string" 
      } 
      } 
     }, 
     "ownerId": { 
      "type": "string", 
      "index": "not_analyzed", 
      "store": true 
     }, 
     "groupId": { 
      "type": "string", 
      "index": "not_analyzed", 
      "store": true 
     }, 
     "itemId": { 
      "type": "string", 
      "index": "not_analyzed", 
      "store": true 
     }, 
     "createdAt": { 
      "type": "date" 
     }, 
     "editedAt": { 
      "type": "date" 
     }, 
     "type": { 
      "type": "string", 
      "index": "not_analyzed" 
     } 
     } 
    } 
    } 
} 

После этого, когда вы хотите точного соответствия вы должны использовать text.standard и когда вы хотите, чтобы выполнить вытекающие (хотите, чтобы соответствовать удалены Удаляет) вы можете вернуться к text

Вы также можете обновить текущее сопоставление, но в обоих случаях вам нужно будет reindex.

PUT test_index/_mapping/test_type 
{ 
    "properties": { 
    "text": { 
     "type": "string", 
     "index": "analyzed", 
     "analyzer": "english", 
     "term_vector": "with_positions_offsets", 
     "fields": { 
     "standard": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

Помогает ли это?

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