簡體   English   中英

java:Elasticsearch中不區分大小寫的搜索

[英]java : Case insensitive search in Elasticsearch

我正在嘗試查找索引中的文檔,而不管索引中的字段值是小寫還是大寫。

這是我使用自定義分析器設計的索引結構。 我是分析儀的新手,我可能錯了。 看起來是這樣的:

POST arempris/emptagnames
{
  "settings": {
      "analyzer": {
        "lowercase_keyword": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": "lowercase"
        }
      }
  },
  "mappings" : {
    "emptags":{
          "properties": {
                "employeeid": {
                  "type":"integer"
                },
                "tagName": {
                  "type": "text",
                  "fielddata": true,
                  "analyzer": "lowercase_keyword"
                }
            }    
        }
    }
}

在Java后端中,我使用BoolQueryBuilder首先使用employeeids查找標記名。 這是我編寫的用於獲取值的代碼:

BoolQueryBuilder query = new BoolQueryBuilder();
            query.must(new WildcardQueryBuilder("tagName", "*June*"));
            query.must(new TermQueryBuilder("employeeid", 358));

            SearchResponse response12 = esclient.prepareSearch(index).setTypes("emptagnames")
                    .setQuery(query)
                    .execute().actionGet();

            SearchHit[] hits2 = response12.getHits().getHits();
            System.out.println(hits2.length);

            for (SearchHit hit : hits2) {
                Map map = hit.getSource();
                System.out.println((String) map.get("tagName"));
            }

當我以小寫形式指定要搜索的標簽為“ june”時,它可以正常工作,但是在WildCardQueryBuilder中以大寫字母形式將其指定為“ June”時,我找不到任何匹配項。

讓我知道我在哪里犯了錯誤。 非常感謝您的幫助並提前致謝。

Elasticsearch有兩種查詢類型

全文查詢的規則是

  • 首先,它在查詢中查找search_analyzer
  • 如果未提及,則它將索引時間分析器用於該字段以進行搜索。

因此,在這種情況下,您需要將查詢更改為此

BoolQueryBuilder query = new BoolQueryBuilder();
        query.must(new QueryStringQueryBuilder("tagName:*June*"));
        query.must(new TermQueryBuilder("employeeid", 358));

        SearchResponse response12 = esclient.prepareSearch(index).setTypes("emptagnames")
                .setQuery(query)
                .execute().actionGet();

        SearchHit[] hits2 = response12.getHits().getHits();
        System.out.println(hits2.length);

        for (SearchHit hit : hits2) {
            Map map = hit.getSource();
            System.out.println((String) map.get("tagName"));
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM