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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (39)

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

示例:我有三个在ElasticSearch中索引的CouchDB文档:

{
  "_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

它确实返回了一个文档(JohnDoeman)。

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

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

)但是似乎什么都没有用。

当我搜索“Doe”时,如何使ElasticSearch同时找到JohnDoeman和Jane DoeWomen?

我尝试使用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。我使用标准标记器和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个字母的单词部分。调整最大值_你需要的话。

用户回答回答于

如果希望能够按单词前缀进行搜索,请删除前面的通配符。如果你确实需要在单词中间找到一个子字符串,那么最好使用ngram标记器。

扫码关注云+社区

领取腾讯云代金券