Spring Data Elasticsearch仅返回完全匹配

时间:2017-04-28 11:57:06

标签: java spring elasticsearch spring-data-elasticsearch

我创建了一个使用Spring Data Elasticsearch测试free text search的简单项目。这是我的实体:

@Document(indexName = "flag", type = "flag")
public class Flag {

    @Id
    private String flagCode;

    @MultiField(mainField = @Field(type = FieldType.String))
    private String flagName;

    // setters and getters
}

现在,我的搜索操作如下:

SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(fuzzyQuery("flagName", freeText))
            .build();
List<Flag> flags =  elasticsearchTemplate.queryForList(searchQuery, Flag.class);

有了这个,我只得到flagNameflagName完全匹配的对象,如果我想要的话,如果至少有2个字符匹配,那么它应该是匹配

如果相关,我的DataConfig文件如下:

@Configuration
@EnableElasticsearchRepositories(basePackages = "com.shubham.dao")
@ComponentScan(basePackages = "com.shubham.data")
public class DataConfig {

    @Value("${elasticsearch.clustername}")
    private String clusterName;

    @Value("${elasticsearch.host}")
    private String elasticsearchHost;

    @Value("${elasticsearch.port}")
    private int elasticsearchPort;

    @Bean
    public Client client() throws Exception {

    Settings esSettings = Settings.settingsBuilder()
            .put("cluster.name", clusterName)
            .build();

    //https://www.elastic.co/guide/en/elasticsearch/guide/current/_transport_client_versus_node_client.html
    return TransportClient.builder()
            .settings(esSettings)
            .build()
            .addTransportAddress(
                    new InetSocketTransportAddress(InetAddress.getByName(elasticsearchHost), elasticsearchPort));
    }

    @Bean
    public ElasticsearchOperations elasticsearchTemplate() throws Exception {
        return new ElasticsearchTemplate(client());
    }
}

我可能做错了什么?我是Elasticsearch的新手。

1 个答案:

答案 0 :(得分:0)

默认情况下,fuzzy查询有一个fuzziness setting of AUTO,表示

  • 如果术语长度介于0到2个字符之间,则必须完全匹配。
  • 如果术语长度在3到5个字符之间,则只允许进行一次编辑
  • 以上,允许两次编辑

在您的情况下,当您对India编制索引时,将对标记india(小写)编制索引。

  • 搜索In意味着4次修改=&gt;没有比赛
  • 搜索Ind意味着3次修改=&gt;没有比赛
  • 搜索Indi意味着2次修改=&gt;没有比赛
  • 搜索India意味着1 edit =&gt;匹配

您可能需要使用edge-ngram来标记您的数据,而不是使用完全不适合搜索您似乎愿意做的前缀的模糊性。