在Elasticsearch中使用ngram进行搜索

Soo*_*Soo 1 java elasticsearch

我可以在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()
Run Code Online (Sandbox Code Playgroud)

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

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

然后我像这样搜索整个领域的"术语".

 curl -XGET localhost:9200/test/_search?q="testte"
Run Code Online (Sandbox Code Playgroud)

我找不到查询的任何结果,"一些部分术语".

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

curl -XGET localhost:9200/test/_search?q=title:testte
Run Code Online (Sandbox Code Playgroud)

我只想在没有'title'字段的情况下使用nGram搜索术语.如何在整个领域中搜索术语?

请告诉我.提前致谢

jav*_*nna 5

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

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

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