2016-04-12 139 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_analyze,它将保持这种状态。另外,如果你想要不区分大小写的数据,为什么不用'关键字'分析器结合'小写'标记过滤器来建立索引? –

+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; 
    }