当前位置: 首页 > 面试题库 >

如何使用ElasticSearch搜索单词的一部分

宿鹏程
2023-03-14
问题内容

我最近开始使用ElasticSearch,但似乎无法让它搜索单词的一部分。

示例:我有我的ouchdb中的三个文档,在ElasticSearch中建立了索引:

{
  "_id" : "1",
  "name" : "John Doeman",
  "function" : "Janitor"
}
{
  "_id" : "2",
  "name" : "Jane Doewoman",
  "function" : "Teacher"
}
{
  "_id" : "3",
  "name" : "Jimmy Jackal",
  "function" : "Student"
}

所以现在,我要搜索包含“ Doe”的所有文档

curl http://localhost:9200/my_idx/my_type/_search?q=Doe

那不会返回任何点击。但是如果我寻找

curl http://localhost:9200/my_idx/my_type/_search?q=Doeman

它确实返回一个文档(John Doeman)。

我尝试将不同的分析器和不同的过滤器设置为索引的属性。我也尝试使用完整的查询(例如:

{
  "query": {
    "term": {
      "name": "Doe"
    }
  }
}

),但似乎没有任何效果。

当我搜索“ Doe”时,如何使ElasticSearch同时找到John Doeman和Jane Doewoman?

更新

我尝试使用nGram标记程序和过滤器,就像Igor提出的那样:

{
  "index": {
    "index": "my_idx",
    "type": "my_type",
    "bulk_size": "100",
    "bulk_timeout": "10ms",
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "my_ngram_tokenizer",
          "filter": [
            "my_ngram_filter"
          ]
        }
      },
      "filter": {
        "my_ngram_filter": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      },
      "tokenizer": {
        "my_ngram_tokenizer": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 1
        }
      }
    }
  }
}

我现在遇到的问题是每个查询都返回所有文档。有指针吗?使用nGram的ElasticSearch文档不是很好…


问题答案:

我也在使用nGram。我将标准标记器和nGram用作过滤器。这是我的设置:

{
  "index": {
    "index": "my_idx",
    "type": "my_type",
    "analysis": {
      "index_analyzer": {
        "my_index_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "mynGram"
          ]
        }
      },
      "search_analyzer": {
        "my_search_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "standard",
            "lowercase",
            "mynGram"
          ]
        }
      },
      "filter": {
        "mynGram": {
          "type": "nGram",
          "min_gram": 2,
          "max_gram": 50
        }
      }
    }
  }
}

让我们找到最多50个字母的单词部分。根据需要调整max_gram。用德语来说可以变得很大,所以我将其设置为很高的值。



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

  • 问题内容: 我想寻求帮助。我想在标题和内容中搜索一个单词。这是结构 查询字符串看起来像这样,在这里我想在“ 15-game”之类的文本中搜索“ 15-g”: 如果我重复这个问题,请接受我的道歉,但我无法查明发生了什么,以及为什么它不返回任何结果。 但是我无法与我合作。 真正有趣的是,如果我搜索“ 15-g”(15个 空格 - 空格 g),它将返回结果。 提前非常感谢您! 问题答案: 也向您添加一个

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

  • 我正在用java编写一个程序,在一个.txt文件中搜索单词列表(事务编号)。txt文件可以有任意行数。 有没有办法处理这种情况?

  • 问题内容: 我正在发送此请求 我得到正确的结果 但是当我想按单词部分搜索时,例如 我没有得到任何结果: 我究竟做错了什么? 问题答案: 这是因为您的字段可能已由标准分析器(默认设置)进行了分析,并且标题已被标记为三个标记,并且。 为了搜索单词的任何子串,您需要创建一个自定义分析器,该分析器利用ngram令牌过滤器来索引每个令牌的所有子串。 您可以这样创建索引: 然后,您可以重新索引数据。这将使标题

  • 我在处理一个单词搜索问题。我正确地实现了dfs搜索,但在其他地方有一些琐碎的错误。