我创建了一个简单的项目来使用 Spring Data Elasticsearch 测试自由文本搜索
。这是我的实体:
@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 的新手。
最佳答案
默认情况下,模糊
查询具有 fuzziness setting of AUTO
,这意味着
- 如果术语长度在 0 到 2 个字符之间,则必须完全匹配。
- 如果术语长度在 3 到 5 个字符之间,则只允许进行一次编辑
- 在此之上,允许进行两次编辑
就您而言,当您索引 India
时,标记 india
(小写)将被索引。
- 搜索
In
意味着 4 次编辑 => 不匹配 - 搜索
Ind
意味着 3 次编辑 => 不匹配 - 搜索
Indi
意味着进行 2 次编辑 => 不匹配 - 搜索
印度
意味着 1 次编辑 => 匹配
您可能需要使用edge-ngram标记您的数据而不是使用模糊性,这根本不适合像您似乎愿意那样搜索前缀。
关于java - Spring Data Elasticsearch 只返回精确匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43679670/