8

我希望能够搜索以下单词

文森特文森特文森特的

目前在 Database 和 ES 中的测试是 Vincent 的

是否可以检测所有格并忽略撇号。我已经查看了 Word-Delimiter,但似乎找不到合适的解释

4

3 回答 3

9

您需要了解 elasticsearch 的分析器是如何工作的。分析器执行标记化(将输入拆分为一堆标记,例如空格)和一组标记过滤器(过滤掉您不想要的标记,例如停用词,或修改标记,例如小写标记过滤器将所有内容转换为小写)。

分析在两个非常特定的时间执行 - 在索引期间(当您将内容放入弹性搜索时)以及根据您的查询,在搜索期间(在您正在搜索的字符串上)。

也就是说,默认分析器是标准分析器,它由标准标记器、标准标记过滤器(从标准标记器中清除标记)、小写标记过滤器停用词标记过滤器组成。

举个例子,当你保存字符串“I love Vincent's pie!”时 进入elasticsearch,你使用的是默认的标准分析器,你实际上存储了“i”、“love”、“vincent”、“s”、“pie”。然后,当您尝试使用term查询(未分析)搜索“Vincent's”时,您将找不到任何内容,因为“Vincent's”不是这些标记之一!match但是,如果您使用查询(已分析)搜索“Vincent's” ,您会发现“I love Vincent's pie!” 因为“vincent”和“s”都找到了匹配项。

底线,要么:

  1. match在搜索自然语言字符串时使用已分析的查询,例如。
  2. 设置分析仪以满足您的需求。如果你想变得复杂,你可以设置一个自定义分析器来执行空格标记器或字母标记器或模式标记器,以及任何你想要的过滤器。这取决于您的用例,但如果您正在处理自然语言句子,我不建议这样做,因为标准标记器是为自然语言搜索而构建的。

如需进一步阅读,请参阅http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html 。

于 2014-03-10T20:31:22.457 回答
4

使用 ES 文档中描述的“possessive_english”词干分析器: http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-stemmer-tokenfilter.html

例子:

{
  "index" : {
    "analysis" : {
        "analyzer" : {
            "my_analyzer" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "my_stemmer"]
            }
        },
        "filter" : {
            "my_stemmer" : {
                "type" : "stemmer",
                "name" : "possessive_english"
            }
        }
    }
  }
}

未经测试的代码,但应该可以工作。这是一个带有“word_delimiter”的经过测试的示例:

{
  "index" : {
    "analysis" : {
        "analyzer" : {
            "my_analyzer" : {
                "tokenizer" : "standard",
                "filter" : ["standard", "lowercase", "my_word_delimiter"]
            }
        },
        "filter" : {
            "my_word_delimiter" : {
                "type" : "word_delimiter",
                "preserve_original": "true"
            }
        }
    }
  }
}

为我工作:-) ES 文档: http ://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-word-delimiter-tokenfilter.html

于 2014-05-10T19:31:28.860 回答
-1

使用像这样的匹配查询搜索带有撇号的单词。

{
   "query": {
      "bool": {
         "must": [
           {
             "match": {
                  "_all": "Vincent Vincents Vincent's"
                 }
              }
            ]
         }
     }
}
于 2013-12-06T10:20:46.440 回答