2015-10-30 2 views
0

У меня есть следующий пользовательский анализатор определен:Синоним анализатор не дает результатам

{ 
    "analysis": { 
    "analyzer": { 
     "products-alike": { 
     "filter": [ 
      "lowercase", 
      "product-db" 
     ], 
     "tokenizer": "standard" 
     } 
    }, 
    "filter": { 
     "product-db": { 
     "type": "synonym", 
     "synonyms": [ 
      "Xiaomi,Mi,Mi3,Mi4,Redmi", 
      "OnePlus,OnePlusOne,OnePlus1,OnePlus2" 
     ] 
     } 
    } 
    } 
} 

Теперь я отобразил это в нужное поле и сделал обработку запросов. Но есть результаты только для точных совпадений, например, если я запрашиваю Xiaomi, есть результаты, но Mi или Mi3 не получит меня. Почему это происходит, и может ли кто-нибудь помочь сделать это?

ответ

1

Вам просто нужно написать все синонимы в нижнем регистре вместо CamelCase, как это:

{ 
    "analysis": { 
    "analyzer": { 
     "products-alike": { 
     "filter": [ 
      "lowercase", 
      "product-db" 
     ], 
     "tokenizer": "standard" 
     } 
    }, 
    "filter": { 
     "product-db": { 
     "type": "synonym", 
     "synonyms": [ 
      "xiaomi,mi,mi3,mi4,redmi", 
      "oneplus,oneplusone,oneplus1,oneplus2" 
     ] 
     } 
    } 
    } 
} 

После этого, он будет работать, то есть, если вы запрашиваете Mi3, вы будете соответствовать все синонимы лексем :

curl -XGET 'localhost:9200/your_index/_analyze?analyzer=products-alike&pretty' -d 'Mi3' 

Результаты:

{ 
    "tokens" : [ { 
    "token" : "xiaomi", 
    "start_offset" : 0, 
    "end_offset" : 3, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "mi", 
    "start_offset" : 0, 
    "end_offset" : 3, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "mi3", 
    "start_offset" : 0, 
    "end_offset" : 3, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "mi4", 
    "start_offset" : 0, 
    "end_offset" : 3, 
    "type" : "SYNONYM", 
    "position" : 1 
    }, { 
    "token" : "redmi", 
    "start_offset" : 0, 
    "end_offset" : 3, 
    "type" : "SYNONYM", 
    "position" : 1 
    } ] 
} 
+0

ли изменить порядок применения фильтров filter: ["products-db", "lowercase"], выдает тот же эффект? –

+0

Да, возможно, но это заставило бы вас зависеть от точного корпуса, и я бы не стал на это рассчитывать. Всегда предпочтительнее обрабатывать все в нижнем регистре (например, сравнивать яблоки с яблоками) – Val

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