一尘不染

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

elasticsearch

我最近开始使用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文档不是很好…


阅读 434

收藏
2020-06-22

共1个答案

一尘不染

我也在使用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。用德语来说可以变得很大,所以我将其设置为很高的值。

2020-06-22