Elasticsearch:搜索由特定符号连接、结尾或包含特定符号的词

Elasticsearch: search words connected by, ends with or contain a specific symbol

我是 Elasticsearch 的新手,仍在学习中。我有一个名为 article 的索引。索引中的文档有一个名为 body 的字段,其中包含一篇文章的文本。文本的语言是 Hindi.

我希望找到由特殊符号 hyphen(-) 连接的单词。

如果我按 id 搜索文章,我会得到如下结果:

GET /article/_doc/<some id>

{
  "_index" : "article",
  "_type" : "_doc",
  "_id" : "<some id>",
  "_version" : 1,
  "_seq_no" : 495,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "web_source" : "<some source>",
    "web_url" : "<some url>",
    "body" : """
 ... उत्तर-पूर्व में चीन, नेपाल और भूटान, पूर्व में बांग्लादेश और म्यान्मार स्थित हैं। हिन्द महासागर में इसके दक्षिण पश्चिम में मालदीव, दक्षिण में श्रीलंका और दक्षिण-पूर्व में इंडोनेशिया से भारत की सामुद्रिक सीमा लगती है। इसके उत्तर की भौतिक सीमा हिमालय पर्वत से और दक्षिण में हिन्द महासागर से लगी हुई है। पूर्व में बंगाल की खाड़ी है तथा पश्चिम में अरब सागर हैं। ...
  """,
      "updated" : "<some date>"
  }
}

很明显,正文字段包含 दक्षिण-पूर्वउत्तर-पूर्व 等词。我希望找到所有这样的词。

当我运行下面的查询时,它给了我很多结果,其中之一就是上面的文档。

GET /article/_search
{
    "query": {
        "match": {
            "body" : "उत्तर-पूर्व"
        }
    },
    "highlight" : {
        "fields" : {
            "body" : {}
        }
    }
}

注意:我尝试了以下查询但没有任何收获,即 returns 0 次点击。

POST /article/_doc/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "body": "*-*"
                    }
                }
            ]
        }
    }
}

使用 Elasticsearch 时,了解文档的标记化方式非常重要。默认的 Elasticsearch 索引使用 Standard analyzer, which removes most punctuation from the document. This is probably the reason you can't search for hyphens. You can use the Analyze API 来了解您的文档是如何分解为标记的。

如评论中所述,您使用的是默认映射,它将使用默认的标准分析器,这将在索引时删除 -,因此您在搜索 [=14= 时没有得到].

match query 被分析,它使用与索引时间相同的分析器,因此它也会删除搜索词的 -,这就是它给出结果的原因。来自匹配查询的同一文档:

Returns documents that match a provided text, number, date or boolean value. The provided text is analyzed before matching.

解决方案 :- 使用 the custom analyzer if you want to search for _ as well, which uses the keyword tokenizer with lower case, as I verified and Hindi analyzer 也会删除 -.

使用印地语分析器生成的令牌

POST /article/_analyze --> noyte `-` removed

{
    "analyzer" : "hindi",
    "text" : "उत्तर-पूर्व"
}

{
    "tokens": [
        {
            "token": "उततर",
            "start_offset": 0,
            "end_offset": 5,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "पुरव",
            "start_offset": 6,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 1
        }
    ]
}

自定义分析器 def(小写关键字)

{
    "settings": {
        "analysis": {
            "analyzer": {
                "lowercasekeyword": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": [
                        "lowercase"
                    ]
                }
            }
        }
    }
}

使用上述自定义分析器生成的令牌

POST articles/_analyze
{
    "analyzer" : "lowercasekeyword",
    "text" : "उत्तर-पूर्व"
}

{
    "tokens": [
        {
            "token": "उत्तर-पूर्व",
            "start_offset": 0,
            "end_offset": 11,
            "type": "word",
            "position": 0
        }
    ]
}

重要说明: 您应该创建另一个字段并在其中包含此 lowercasekeyword 分析器并将其用于您的通配符搜索。如前所述,match 查询已被分析并且不会在此字段上工作。