【问题标题】:Elastic search case insensitive弹性搜索不区分大小写
【发布时间】:2016-08-03 00:59:54
【问题描述】:

我有以下基于注释的弹性搜索配置,我已将索引设置为不被分析,因为我不希望这些字段被标记化:

    @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()));
}

【问题讨论】:

  • 不可能。不是关于 Spring Data 配置,而是关于 Elasticsearch 本身。您将数据索引为 not_analyzed,它将保持这种状态。此外,如果您想要不区分大小写的数据,为什么不使用 keyword 分析器和 lowercase 标记过滤器进行索引?
  • 感谢您的回复,我想这正是我所需要的。
  • Andrei 能否将您的回复作为答案发布,以便我接受?

标签: elasticsearch lucene spring-data


【解决方案1】:

我根据 Andrei Stefan 的建议找到了一些与使用注释类似的结果:

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

【讨论】:

    【解决方案2】:

    您想要做的事情不太可能,这与 Spring Data 配置无关,而与 Elasticsearch 本身有关:您将数据索引为 not_analyzed,它将保持这种状态。

    另外,如果您想要不区分大小写的数据,我建议您使用 keyword analyzerlowercase token filter 组合索引。

    【讨论】:

      【解决方案3】:

      你可以添加@Setting,它消耗文件路径,在@Document之后,设置文件应该包含这样的json: {"analysis":{"analyzer":{"case_insensitive":{"type":"custom","tokenizer":"whitespace","char_filter":["html_strip"],"filter":["lowercase","asciifolding"]}}}} 和分析器的字段注释@Field(type = FieldType.Keyword, analyzer = "case_insensitive")

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2013-09-26
        相关资源
        最近更新 更多