当前位置: 首页 > 知识库问答 >
问题:

使用AND运算符按多个单词搜索

督辉
2023-03-14

这很有魅力:

        Client client = new TransportClient().addTransportAddress(new InetSocketTransportAddress("localhost", 9300));

        FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("field", "word_1");
        fuzzyQueryBuilder.fuzziness(Fuzziness.AUTO);

        SearchResponse response = client.prepareSearch("ts_index")
                                        .setTypes("service")
                                        .setQuery(fuzzyQueryBuilder)
                                        .setFrom(0).setSize(60).setExplain(true)
                                        .execute()
                                        .actionGet();
        SearchHit[] results = response.getHits().getHits();

但如果我想按多个单词搜索,它将不返回任何内容,例如:

FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("field", "word_1 word_2");

当我使用CURL时,我通过将运算符添加到我的JSON属性来解决这个问题:

卷曲-XGET“http://localhost:9200/_search“-d”{“查询”:{“匹配”:{“字段”:{“查询”:“word\u 1 word\u 2”,““模糊性”:“自动”,““运算符”:“和”}}}}}”

我如何在Java中实现这一点?

共有2个答案

曾成天
2023-03-14

您可以尝试使用枚举以动态方式构建它:

 public enum MultiQueryBuilder {

  OPERATOR_AND {
    @Override
    public QueryBuilders createQuery(String field, String multiWord) {
    String[] words = multiWord.split("\\s+");
    QueryBuilder queryBuilder = QueryBuilder.boolQuery();
    for(String word : words){
     queryBuilder.must(QueryBuilders.fuzzyQuery(field, word));
    }    
    return queryBuilder;
},

 OPERATOR_OR {
    @Override
    public QueryBuilders createQuery(String field, String multiWord) {
    String[] words = multiWord.split("\\s+");
    QueryBuilder queryBuilder = QueryBuilder.boolQuery();
    for(String word : words){
     queryBuilder.should(QueryBuilders.fuzzyQuery(field, word));
    }    
 return queryBuilder;
};

 public abstract Querybuilders createQuery(String field, String multiWord);
}

你只需要这样称呼它:

FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders
    .fuzzyQuery(MultiQuerybuilder
    .valueOf(OPERATOR_AND)
    .createQuery("field", "word_1 word_2"));
韦原
2023-03-14

我相信这是可能的,对于和,必须;对于或,应该:

 QueryBuilder qb = QueryBuilders.boolQuery()
                .must(QueryBuilders.fuzzyQuery("field", "word_1"))
                .must(QueryBuilders.fuzzyQuery("field", "word_2"));
 类似资料:
  • 问题内容: 我想以查询其他字段的相同方式将多值字段的值查询为单独的“字段”。我有这样的数据结构: 我的查询如下所示: 仅当值包含我的整个查询时,“类型”和“运算符”才能完美匹配单个值字段。例如,查询“ foo two”不会返回匹配项。 我希望标签字段的行为相同。现在,查询“东西”将在不应该返回匹配项时返回匹配项,因为没有字段或标记值将两个单词都包含在一个值中。有没有办法做到这一点? 编辑 Val的

  • 我在一个项目中使用全文搜索。我想搜索多个单词,但我有一个问题。所以我的查询是; 这个查询是包括word1或word2或word3或word4的搜索,但我想搜索包括word1或word2或word3 word4的搜索 那么解决方案是什么呢?

  • 我有一个记录数据库,每个记录都有一个右和一个左字段,这两个字段都包含文本。数据库使用Elasticsearch建立索引。 我想搜索这些记录的两个字段,并找到在任何字段中包含两个或更多带有特定前缀的单词的记录。搜索应该足够具体,以便只查找包含查询中所有单词的记录,而不仅仅是其中的一些单词。 例如,qui bro查询应该返回包含“敏捷的棕色狐狸跳过了懒惰的狗”这句话的记录,而不是包含“敏捷的狐狸跳过了

  • 我正在尝试学习与php composer包的帮助。我有一个,其名称为,其中包含、、、字段。我想有基于以上字段的过滤器,它应该在操作符。我当前的查询代码是: 我的问题是: > 我无法获取数据。但是如果我执行下面的代码: 我在运算符中获取值,但需要在其中包含操作。

  • 问题内容: 我从来没有真正听到过关于这个问题的直接答案,我只需要FULLTEXT搜索包含多个单词“ Firstname Lastname”的几列 但是,如果我在此处输入多个单词,它将无法运行查询。 问题答案: 如果要进行精确搜索:

  • 问题内容: 我曾经使用过django,haystack和elasticsearch。 我的search_index.py: 搜索表格: 模板: 看 ` 我得到所有的价值,那里有“老板”和“挡泥板” 当您在搜索框中输入“ boss fender”时,我没有结果。从搜索表单中,我只能得到一个单词的结果,例如“老板”。如何使搜索多个单词的能力? 问题答案: 这个月我陷入了这个问题。 为了执行正确的查询,