2016-02-03 2 views
0

Я пробовал сопоставлять синонимы различных комбинаций, чтобы иметь возможность запросить просто для n1 и найти элементы, содержащие N°1 (это степень символ).Упругий поиск: Возможность поиска «n1» и соответствия «N ° 1»

Если я ищу N°1, я могу найти нужные строки без проблем. Синоним работает так, как будто я ищу «тест», он будет соответствовать «testword». Интересно, могут ли фильтры asciifolder или lowercase вмешиваться в символ степени или что-то в фильтрах standard (так как даже удаление этих фильтров не имеет значения).

Это из настроек индексов.

filter: { 
    exampleSynonyms: { 
     type: 'synonym', 
     synonyms: [ 
      'n1, no1, number1, no 1, n 1, number 1 => N°1', 
      'test => testword' 
     ] 
    }, 
    exampleStops: { 
     type: 'stop', 
     stopwords: ['N°1', 'n°1'] 
    }, 
    exampleAscii: { 
     type: 'asciifolding', 
     preserve_original: true 
    } 
}, 
analyzer: { 
    default_search: { 
     tokenizer: 'standard', 
     filter: ['exampleStops', 'exampleSynonyms', 'lowercase', 'exampleAscii' ] 
    } 

} 

Что может помешать ° от использования в качестве синонима?

PS. Символ степени находится в наборе ASCII.

ответ

1

Проблема в том, что standard tokenizer удаляет ° еще до того, как он достигнет synonym filter. Вы можете проверить это с помощью analyze api.

curl -XGET 'localhost:9200/_analyze' -d ' 
{ 
    "tokenizer" : "standard", 
    "text" : "N°1" 
}' 

Вы увидите два маркера N и . Filters применяются послеtokenization, поэтому вместо синонимов вы можете использовать pattern replace char filter и заменить символ степени пустой строкой. Это минимальная установка

PUT degree 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "degree_analyzer": { 
      "char_filter": [ 
      "degree_mapping" 
      ], 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "asciifolding" 
      ] 
     } 
     }, 
     "char_filter": { 
     "degree_mapping": { 
      "type": "pattern_replace", 
      "pattern": "°", 
      "replacement": "" 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "mydoctype":{ 
     "properties": { 
     "title" : { 
      "type": "string", 
      "analyzer": "degree_analyzer" 
     } 
     } 
    } 
    } 
} 

с этим N°1 будет индексироваться n1 и простой match query даст вам желаемым результаты

{ 
    "query": { 
    "match": { 
     "title": "n1" 
    } 
    } 
} 

Надеется, что это помогает.

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