Elasticsearch全文搜索和完全匹配

时间:2018-06-04 09:44:49

标签: elasticsearch full-text-search n-gram

Elasticsearch Mapping

PUT testindex
{
  "settings": {
    "analysis": {
            "filter": {},
            "tokenizer": {
              "my_tokenizer": {
                  "type": "ngram",
                  "min_gram": 3,
                  "max_gram": 3,
                  "token_chars": []
                }
            },
            "analyzer": {
                "my_analyzer": {
                  "tokenizer": "my_tokenizer",
                  "filter": ["lowercase"]
                },
                "hiphen_analyzer": {
                    "tokenizer": "whitespace",
                    "filter": ["lowercase"]
                }
            }
        }
  },
    "mappings": {
      "test": {
        "properties": {
          "catch_all": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "store": true,
                            "ignore_above": 256
                        },
                        "raw": {
                            "type": "text",
                            "store": true,
                            "analyzer": "hiphen_analyzer",
                            "search_analyzer": "whitespace"
                        },
                        "ngrams": {
                          "type": "text",
                          "store": true,
                          "analyzer": "my_analyzer"
                        }
                    }
          },
          "hostname": {
            "type": "text",
            "copy_to": "catch_all"
          }
        }
      }
    }
}

文档

POST testindex/test
{
"hostname": "server-testing-01"
}
POST testindex/test
{
"hostname": "Dell Poweredge 111"
}

我有服务器主机名,例如" server-testing-01"," server-testing-02"," Dell Poweredge Server"。

在elasticsearch中创建一个映射,其中一个字段名为hostname,为#34; text"和copy_to字段" catch_all"。

现在只有一个字段"主机名"但其他字段也将被复制到catch_all字段。

有一个全局搜索框可帮助客户搜索这些主机名和其他数据。

  1. 搜索"测试"结果应该有" server-testing-01"," server-testing-02"。搜索" power"时,结果应该是" Dell Poweredge Server"。搜索" edge"时,结果应该是" Dell Poweredge Server"
  2. 搜索精确"服务器测试-01"结果应该只包含一个结果。
  3. 编辑: 目前尝试过ngram自定义分析器,它可以为某些部分搜索提供正确的结

    某些机构如何在弹性搜索中实现部分搜索以及精确搜索?

1 个答案:

答案 0 :(得分:0)

实现第二点的最简单方法是,因为您已经解决了第一点,就是将现有查询包装在布尔查询中,并将现有查询和新术语查询放在带有{{1}的should子句中}。这样它将为您提供第二种选择。如果您需要一个有效的示例,您需要提供您的映射,一个或两个文档作为样本和您的查询。

您的使用案例非常广泛。你可以放置所有可能的分析仪,但仍然会错过任何东西。我相信你并不需要所有这些分析仪或任何复杂的查询。以下内容非常简单(尽管需要谨慎对待性能)。

minimum_should_match 1

一般情况下,您可以使用edge-ngrams,但这不会涵盖PUT testindex { "settings": { "analysis": { "analyzer": { "keyword_lowercase": { "tokenizer": "keyword", "filter": [ "lowercase" ] } } } }, "mappings": { "test": { "properties": { "hostname": { "type": "text", "analyzer": "keyword_lowercase" } } } } } GET testindex/_search { "query": { "wildcard": { "hostname": { "value": "*test*" } } } } GET testindex/_search { "query": { "wildcard": { "hostname": { "value": "*dell*power*" } } } } GET testindex/_search { "query": { "wildcard": { "hostname": { "value": "*edge*" } } } } 示例,因为它们从头开始。你可以使用ngrams,但是edge是不够的,并且会有一些你会错过的情况。 通过这种方法,您几乎可以涵盖所您需要在应用程序级别执行的操作是针对给定的输入 小写的 2.用通配符包装输入

示例:

  • max 3 - > Dell
  • *dell* - > SERVER
  • *server* - > DELL POWER

小心虽然你仍然会遗漏一些案例 示例:

  • *dell power* - > server testing

以上不起作用。如果你需要它可以工作,那么你可以在每个空格上添加一个通配符,然后上面就变成了这个

  • *server testing* - >可以使用server testing

这种方法可以让您的索引更小,但在搜索过程中您将付出代价,具体取决于您的数据大小和请求量。 你可以尝试一下。

一般情况下,通配符查询在某种程度上是核心的,所以要小心谨慎。 另一种方法是增加ngrams的最大值,但这会大大增加你的指数。我真的不知道你的情况,所以......看看你自己。