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

如何在elasticsearch中搜索句子的开头和结尾

暴招
2023-03-14

我试图搜索以下两个案例

我想搜索一个以特定单词开头的名称。例如:

名称:测试名称

名称:名称测试

名称:测试名称测试

如果我搜索“test”,那么它应该只返回“test name”和“test name test”。

我想搜索一个以特定单词结尾的名称。例如:

名称:测试名称

名称:名称测试

名称:测试名称测试

如果我搜索“测试”,那么它应该只返回“名称测试”和“测试名称测试”。

有人能帮我找出查询elasticsearch java API或任何其他方式来搜索它。

弹性搜索版本6.2.1

非常感谢您的帮助。

共有2个答案

阎功
2023-03-14

对于情况1,您可以使用CompletionSuggester。您需要一个字段的特殊映射来使用完成提示器,如下所示:

"mappings": {
"some_index": {
    "properties": {
        "title": {
            "type": "completion"
        }
    }
}}

在代码中,您应该定义建议者,如下所示(term是您的搜索词,“start”是任意名称):

CompletionSuggestionBuilder completionBuilder = SuggestBuilders.completionSuggestion("title").prefix(term);
SuggestBuilder suggestBuilder = new SuggestBuilder();
suggestBuilder.addSuggestion("starts", completionBuilder);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.suggest(suggestBuilder);
SearchRequest searchRequest = new SearchRequest("index_name");
searchRequest.source(searchSourceBuilder);

获得搜索响应后,对其进行处理以检索建议:

  Suggest suggest = searchResponse.getSuggest();
  if (suggest == null) {
    return Collections.emptyList();
  } else {
    CompletionSuggestion suggestion = suggest.getSuggestion("starts");
    return suggestion
        .getOptions()
        .stream()
        .map(CompletionSuggestion.Entry.Option::getText)
        .map(Text::toString)
        .collect(Collectors.toList());
  }
谭宜
2023-03-14

您需要将映射与search\u analyzer属性一起使用(analyzer\u startswith或analyzer\u endswith)

"mappings": {
    "some_index": {
        "properties": {
            "title": {
                "search_analyzer": "analyzer_startswith",
                "index_analyzer": "analyzer_startswith",
                "type": "string"
            }
        }
    }
}

差不多

 类似资料:
  • 我实际上是一个新手到Java,并试图做一个小项目。所以,在我的项目中,我想让用户输入一个句子,我想让程序在句子中搜索特定的单词,并基于此给出输出。我使用NetBeans开发我的应用程序。 我的代码是这样的 我知道这段代码没有意义,也不会运行,但我这样说是为了让人们对我试图实现的目标有一个大致的了解。 请帮帮我.

  • 问题内容: 首先创建一些示例数据(e1,e2,e3是类型,而test是索引名称): 现在我的问题是:我怎样才能仅获得这两个数据?删除结果中具有相同ID的重复数据。 问题答案: 首先,您将需要搜索多个索引。 然后,在结果上删除重复的ID。

  • 问题内容: 在Elasticsearch中,如何搜索任意子字符串,也许包括空格?(仅搜索单词的一部分是不够的;我想搜索整个字段的任何子字符串。) 我想它必须在一个字段中,而不是一个字段中。 假设我的Elasticsearch索引中只有几千个文档,然后尝试: 可以按预期工作,我得到了描述中“计划”所在的每个项目,甚至是“替代”项目。 现在,我想做 …以便在许多其他可能性中将文件与“ Kaplan不是

  • 我需要对以搜索词开头的搜索结果进行优先级排序。我用了“匹配短语前缀”。我用了“匹配短语前缀”。但它不起作用。 细节: > 质疑 结果

  • 这是mysql查询。如何在ElasticSearch中编写此查询?我使用的是elasticsearch版本0.90.7。

  • 问题内容: 我听说由于性能原因,不建议在SQL Server的LIKE子句的开头使用%。为什么会这样呢? 关于此的更多详细信息将帮助我理解此问题的影响。 问题答案: 子句开头的A表示索引完全无用。如果有静态文本将模式锚定到的前面,则至少可以从索引中获得潜在的实用性。