2016-04-12 2 views
1

У меня есть следующая аннотация на основе конфигурации эластичным поиска, я установил индекс не должны быть проанализирован, потому что я не хочу, чтобы эти поля должны быть лексем:Упругие поиск регистронезависимы

@Document(indexName = "abc", type = "efg") 
    public class ResourceElasticSearch { 
    @Id 
    private String id; 
    @Field(type = FieldType.String, index = FieldIndex.not_analyzed) 
    private String name; 
    @Field(type = FieldType.String, store = true) 
    private List<String> tags = new ArrayList<>(); 
    @Field(type = FieldType.String) 
    private String clientId; 
    @Field(type = FieldType.String, index = FieldIndex.not_analyzed) 
    private String virtualPath; 
    @Field(type = FieldType.Date) 
    private Date lastModifiedTime; 
    @Field(type = FieldType.Date) 
    private Date lastQueryTime; 
    @Field(type = FieldType.String) 
    private String modificationId; 
    @Field(type = FieldType.String) 
    private String realPath; 
    @Field(type = FieldType.String) 
    private String extension; 
    @Field(type = FieldType.String) 
    private ResourceType type; 

Можно ли с помощью используя аннотации, чтобы сделать поиск по имени, virtualPath и тегам нечувствительным к регистру? поиска выглядит следующим образом, поиск по маске требуется:

private QueryBuilder getQueryBuilderForSearch(SearchCriteria criteria) { 
    String virtualPath = criteria.getPath(); 

    return boolQuery() 
      .must(wildcardQuery("virtualPath", virtualPath)) 
      .must(wildcardQuery("name", criteria.getName())); 
} 
+1

Невозможно. Речь идет не о конфигурации Spring Data, а о самом Elasticsearch. Вы индексировали данные как not_analyzed, и он останется таким. Кроме того, если вы хотите нечувствительность к регистру данных, почему бы не индексировать с помощью анализатора «keyword» в сочетании с фильтром токенов «нижнего регистра»? –

+0

Спасибо за ответ, я думаю, что это именно то, что мне нужно. – Andrei

+0

Андрей, пожалуйста, напишите свой ответ как ответ, чтобы я мог его принять? – Andrei

ответ

4

Не действительно возможно что вы хотите сделать, и речь идет не о настройке Spring Data, а о самом Elasticsearch: вы проиндексировали данные как not_analyzed, и он останется таким.

Кроме того, если вы хотите данные, не учитывающие регистр, я предлагаю индексирование с помощью keyword analyzer в сочетании с lowercase token filter.

1

Я нашел кое-что, основываясь на предложении Андрея Стефана, который имеет такой же результат с использованием аннотаций:

@Bean 
    public Client client() throws IOException { 
    TransportClient client = new TransportClient(); 
    TransportAddress address = new InetSocketTransportAddress(env.getProperty("elasticsearch.host"), Integer.parseInt(env.getProperty("elasticsearch.port"))); 
    client.addTransportAddress(address); 

    XContentBuilder settingsBuilder = XContentFactory.jsonBuilder() 
      .startObject() 
      .startObject("analysis") 
      .startObject("analyzer") 
      .startObject("keyword") 
      .field("tokenizer", "keyword") 
      .array("filter", "lowercase") 
      .endObject() 
      .endObject() 
      .endObject() 
      .endObject(); 
    if (!client.admin().indices().prepareExists("abc").execute().actionGet().isExists()) { 
     client.admin().indices().prepareCreate("abc").setSettings(settingsBuilder).get(); 
    } 
     return client; 
    } 
Смежные вопросы