在elasticsearch java中搜索子字符串

abithluo  于 2021-06-13  发布在  ElasticSearch
关注(0)|答案(1)|浏览(382)

我正在ElasticSearch工作,并试图寻找一个领域内的子字符串。例如-在堆栈溢出中搜索字符串tac。我正在为此使用multimatchquery,但它不起作用。下面是我的代码片段(first\u name是字段名)。

searchString = "*" + searchString.toLowerCase() + "*";
MultiMatchQueryBuilder mqb = new MultiMatchQueryBuilder("irs", first_name);
mqb.type(MultiMatchQueryBuilder.Type.PHRASE);
BoolQueryBuilder searchQuery = boolQuery();
searchQuery.should(mqb);
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withQuery(searchQuery);
NativeSearchQuery query = queryBuilder.build();

当我搜索tac时,它不会返回任何结果。当我搜索stack或overflow时,它会返回stack overflow。
所以它寻找精确的字符串。我试过用 MultiMatchQueryBuilder.Type.PHRASE_PREFIX 但它会查找以子字符串开头的短语。它适用于stac或overf之类的字符串,但不适用于tac或tack。
有没有关于如何解决的建议?

2sbarzqh

2sbarzqh1#

macth查询的分析和应用与索引期间应用的分析器相同,我相信您使用的是 standard analyzer,它生成以下令牌

POST http://localhost:9200/_analyze

{
    "text": "stack overflow",
    "analyzer" : "standard"
}

{
    "tokens": [
        {
            "token": "stack",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "overflow",
            "start_offset": 6,
            "end_offset": 14,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

因此寻找 tac 如果不匹配索引中的任何标记,则需要更改分析器,使其匹配查询时间标记和索引时间标记。
n-gram标记器可以解决这个问题。
例子
索引Map

{
  "settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 10
        }
      },
      "analyzer": {
        "autocomplete": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    },
    "index.max_ngram_diff" : 10
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "autocomplete", 
        "search_analyzer": "standard" 
      }
    }
  }
}

索引示例文档

{
   "title" :  "stack overflow"
}

和搜索查询

{
    "query": {
        "match": {
            "title": "tac"
        }
    }
}

和搜索结果

"hits": [
            {
                "_index": "65241835",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.4739784,
                "_source": {
                    "title": "stack overflow"
                }
            }
        ]
    }

相关问题