我可以在Elasticsearch中搜索字词 顺便说一句,我设置如下设置:
.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
我只想在没有'title'字段的情况下使用nGram搜索字词。如何在整个领域中搜索术语?
请告诉我。提前致谢
答案 0 :(得分:5)
只有在使用ngrams索引的字段上搜索时,才能返回通过ngrams获得的部分匹配。在您的情况下,它是您的映射中定义的title
字段。如果您未在query_string query中指定字段,则默认情况下会使用_all
字段,该字段使用standard analyzer编制索引。您可以在查询中指定其他默认字段,以便可以避免为每个术语指定它。如果要将ngrams应用于所有字段,可以更改_all
字段的映射,但我不建议这样做。
Ngrams倾向于大大增加索引的大小,因此我不会在任何地方应用它们。此外,通常最好对每个字段(或字段组)应用不同的文本分析,这通常是域驱动的。
此外,_all
字段在开始和搜索所有内容时非常方便,但它是应用于所有字段的相同文本分析,您可能不希望在生产中依赖它。我建议从长远来看禁用它。
另一个提示:查看match query,这是在大多数情况下使用的查询。 query_string为您提供更多功能,但同时又容易出错。我会使用匹配查询,除非您需要只有query_string提供的功能。