我创建了一个使用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);
有了这个,我只得到flagName
与flagName
完全匹配的对象,如果我想要的话,如果至少有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的新手。
答案 0 :(得分:0)
默认情况下,fuzzy
查询有一个fuzziness setting of AUTO
,表示
在您的情况下,当您对India
编制索引时,将对标记india
(小写)编制索引。
In
意味着4次修改=&gt;没有比赛Ind
意味着3次修改=&gt;没有比赛Indi
意味着2次修改=&gt;没有比赛India
意味着1 edit =&gt;匹配您可能需要使用edge-ngram来标记您的数据,而不是使用完全不适合搜索您似乎愿意做的前缀的模糊性。