Используя Hibernate Search (Lucene), мне нужно уметь искать код с или без черточек - PullRequest
2 голосов
/ 23 июля 2011

Это действительно то же самое, что и для социального обеспечения.

Если у меня есть код в этом формате:

WHO-S-09-0003

Я хочу иметь возможность:

query = qb.keyword().onFields("key").matching("WHOS090003").createQuery();

Я пытался использовать WhitespaceAnalyzer.

Ответы [ 2 ]

3 голосов
/ 05 августа 2011

При использовании StandardAnalyzer или WhitespaceAnalyzer обе проблемы одинаковы.Они будут индексировать «WHO-S-09-0003» как есть, что означает, что когда вы выполняете поиск, он будет работать, только если у вас есть дефисы в поисковом запросе.Одним из решений вашей проблемы может быть реализация собственного TokenFilter , который определяет формат ваших кодов и удаляет дефисы во время индексации.Вы можете использовать AnayzerDef для построения цепочки фильтров toekn и общего пользовательского анализатора.Конечно, вам придется использовать тот же анализатор при поиске, но DSL поискового запроса Hibernate позаботится об этом.

0 голосов
/ 09 августа 2011

на самом деле вы можете реализовать свой собственный метод, подобный этому:

private String specialCharacters(String keyword) {
    String [] specialChars = {"-","!","?"};

    for(int i = 0; i < specialChars.length; i++ ) 
        if(keyword.indexOf(specialChars[i]) > -1)
            keyword = keyword.replace(specialChars[i], "\\"+specialChars[i]);

    return keyword;
}

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

...