1

我可以在 Elasticsearch Btw 中搜索术语,我设置如下:

.startObject("filter")
    .startObject("lowercase")
         .field("type", "lowercase")
    .endObject()
.endObject()
.startObject("filter")
    .startObject("ngram")
        .field("type", "nGram")
        .field("min_gram", "3")
        .field("max_gram", "10")
    .endObject()
.endObject()

然后我试着像这样映射这个。

builder.startObject().startObject(TYPE_TEST).startObject("properties");
   builder.startObject(title)
            .field("type", "string")
            .field("store", "yes")
            .field("analyzer", "series_analyzer")
            .field("boost", "10")
   .endObject();

然后我像这样在整个字段中搜索“术语”。

 curl -XGET localhost:9200/test/_search?q="testte"

我找不到任何查询结果,“一些部分条款”。

相反,我可以通过此查询获得良好的结果

curl -XGET localhost:9200/test/_search?q=title:testte

我只想用没有“标题”字段的 nGram 搜索术语。如何在整个字段中搜索术语?

请告诉我。提前致谢

4

1 回答 1

5

只有在使用 ngrams 索引的字段上进行搜索时,才能通过 ngrams 获得部分匹配。在您的情况下,它是title映射中定义的字段。当您未在query_string 查询中指定字段时,它默认使用该字段,该字段使用标准分析器_all进行索引。您可以在查询中指定不同的默认字段,这样您就可以避免为每个术语指定它。如果您想将 ngrams 应用于所有字段,您可以更改_all字段,但我不建议这样做。Ngram 往往会大大增加索引的大小,因此我不会将它们应用到任何地方。此外,通常最好对每个字段(或字段组)应用不同的文本分析,这通常是域驱动的。

此外,在_all开始和搜索所有内容时,该字段非常方便,但它是应用于所有字段的相同文本分析,您可能不想在生产中依赖它。我宁愿建议从长远来看禁用它。

另一个提示:查看match query,这是在大多数情况下使用的查询。query_string 为您提供了更多功能,但同时也容易出错。除非您需要只有 query_string 提供的功能,否则我会使用匹配查询。

于 2013-07-16T08:10:07.023 回答