MongoDB文本索引在使用$text查询时是必需的。

huangapple go评论117阅读模式
英文:

MongoDB text index required for $text query

问题

我试图寻找一个关于我的问题的答案,但是针对我的特定问题,我找不到任何相关内容。
当我尝试使用TextCriteria在我的集合上进行简单的文本搜索时,出现了错误:

查询失败,错误代码为27,错误消息为“$text查询需要文本索引”。

我确定这是我的mongo错误,但我无法解决这个问题。

我的集合实现示例:

@Document(collection = "mission")
@Getter
@Setter
@JsonInclude(Include.NON_NULL)
public class Mission {
    @Id
    @JsonProperty("_id")
    private String id;

    @JsonProperty("secteur")
    private String secteur;

    @JsonProperty("client")
    private String client;

    @Field
    @TextIndexed
    @JsonProperty("poste")
    private String poste;

    @Field
    @TextIndexed
    @JsonProperty("competences")
    private List<Competence> competences;

    @Field
    @TextIndexed
    @JsonProperty("description")
    private String description;
}

我用来检索列表的方法:

@Override
public Collection<Mission> findAllByCriteria() {
    return missionDao.findAllBy(TextCriteria.forDefaultLanguage().matchingAny("angular"));
}
英文:

I tried to find an answer to my question but i couldn't find anything with my specific problem.
When i try to do a simple text search on my collection with TextCriteria i have the error :

Query failed with error code 27 and error message &#39;text index required for $text query&#39;

I know for sure it is a mongo error on my part but i am not able to solve the problem.

Sample of my collection implementation :

@Document(collection = &quot;mission&quot;)
@Getter
@Setter
@JsonInclude(Include.NON_NULL)
public class Mission {
	@Id
	@JsonProperty(&quot;_id&quot;)
	private String id;

	@JsonProperty(&quot;secteur&quot;)
	private String secteur;

	@JsonProperty(&quot;client&quot;)
	private String client;

	@Field
	@TextIndexed
	@JsonProperty(&quot;poste&quot;)
	private String poste;
	
	@Field
	@TextIndexed
	@JsonProperty(&quot;competences&quot;)
	private List&lt;Competence&gt; competences;

	@Field
	@TextIndexed
	@JsonProperty(&quot;description&quot;)
	private String description;

The method i use to retrieve my list :

@Override
public Collection&lt;Mission&gt; findAllByCriteria() {
	return missionDao.findAllBy(TextCriteria.forDefaultLanguage().matchingAny(&quot;angular&quot;));
}

答案1

得分: 1

这个特定的集合是否一开始就创建了适当的文本索引?如果不知道数据库是如何创建的,有可能没有创建索引,你可能需要自己创建。如果你已经在使用相同的代码将这个实体持久化到数据库中,MongoDB 应该会为你创建文本索引。

请参考MongoDB 文档中关于文本索引的部分,并查看这个帖子

英文:

Does this specific collection have the appropriate text index created in the first place? Without knowing how the DB was created it's possible it doesn't and you'll have to create it yourself. If you're already using the same code to persist this entity into the DB then Mongo should create the text indexes for you.

See Mongo documentation on text indexes, and check this post.

答案2

得分: 1

如果其他人遇到这个问题,可以尝试在 application.yml 中使用以下属性:

spring:
  data:
    mongodb:
      auto-index-creation: true

或者在 application.properties 中使用以下属性:

spring.data.mongodb.auto-index-creation=true

这样 Spring 将自动设置文本索引,您无需使用 shell。

英文:

If anyone else runs into this problem, try this property in application.yml:

spring:
  data:
    mongodb:
      auto-index-creation: true

Or in application.properties:

spring.data.mongodb.auto-index-creation=true

This way spring will automatically set the text index, and you don't need to use the shell.

huangapple
  • 本文由 发表于 2020年10月9日 04:58:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/64270492.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定