java - Spring Data Elasticsearch 只返回精确匹配

标签 java spring elasticsearch spring-data-elasticsearch

我创建了一个简单的项目来使用 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);

这样,我只能获取 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 的新手。

最佳答案

默认情况下,模糊查询具有 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/

相关文章:

java - Android中如何在不锁定UI线程的情况下等待?

c# - 搜索日期范围内的票证字段

elasticsearch - filebeats 的 Nginx 模块不解析访问日志

linux - Elasticsearch安装错误: No such file or directory

java - concurrencyLevel 为 1 的 ConcurrentHashMap 是否可以像 HashMap 一样工作

java - HandledContributionItem.canExecuteItem 中的 NPE

java - Eclipse提供“无法创建Java虚拟机”

java - 如何在 RequestMapping 中为 RESTful 服务在 Spring 中进行 DRY?

java - 配置Spring bean

java - 如何使 Spring Boot 应用程序抵抗数据库连接错误?