【问题标题】:Search for substring in Elastic Search Java在 Elastic Search Java 中搜索子字符串
【发布时间】:2021-03-22 07:22:46
【问题描述】:

我正在使用弹性搜索并尝试在字段中查找子字符串。例如 - 在 stack overflow 中搜索字符串 tac 。我为此使用 MultiMatchQuery,但它不起作用。这是我的代码的 sn-p(first_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 时,它不会返回任何结果。当我搜索 stackoverflow 时,它确实返回 stack overflow

所以它会寻找确切的字符串。我尝试使用MultiMatchQueryBuilder.Type.PHRASE_PREFIX,但它会查找以子字符串开头的短语。它适用于 stacoverf 等字符串,但不适用于 tactack

关于如何修复它的任何建议?

【问题讨论】:

  • 它返回什么?怎么不行?
  • @BalázsNémeth 更新了描述
  • @NikhiR,你有机会看我的回答吗?如果有帮助,请点赞并接受答案。

标签: java elasticsearch elasticsearch-5


【解决方案1】:

Macth 查询的分析和应用与索引期间应用的分析器相同,我相信您使用的是standard 分析器,它在标记下生成

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 tokenizer可以解决问题。

例子

索引映射

{
  "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"
                }
            }
        ]
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多