【问题标题】:Multiple keyword search in MongdoDB using Morphia, For a document with multiple text indexed field使用 Morphia 在 MongdoDB 中进行多个关键字搜索,对于具有多个文本索引字段的文档
【发布时间】:2016-05-01 17:42:38
【问题描述】:

我需要您的建议,以便在索引多个字段的文档中搜索多个关键字。

假设我有一个实体 Employee,如下所示,并且我在此文档中索引了多个字段。

@Entity("employee")
@Indexes({@Index(fields = @Field(value = "employeeName", type = IndexType.TEXT)),
          @Index(fields = @Field(value = "employeeDept", type = IndexType.TEXT)),})
public class Employee {

    @Id private ObjectId id;

    private long empId;

    private String employeeName;

    private String employeeDept;

    ..... Many other fields!!!!

所以我想在本文档中进行多关键字搜索 ( $in ).. 并获取结果列表。我正在使用 Morphia 框架,需要您使用相同的建议

现在我正在使用最新的 Morphia(1.+) 和 MongoDB(3.+)。在 morphia 中,我只能在特定字段而不是整个文档上进行多关键字搜索( $in )。

datastore.find(Employee.class).field("employeeName").in(Arrays.asList("name1","name2")).limit(BATCH_SIZE).asList();

但是假设我有一个搜索查询来查找 employeeName deptName .. 如果任何关键字匹配我想在我的搜索结果中返回该文档。

我该怎么做?

更新


我没有在整个文档上使用 search(),因为,我将每个单词视为单独的搜索条件。

【问题讨论】:

    标签: mongodb full-text-search morphia database


    【解决方案1】:

    以下应该有效:

    Query<Employee> query = datastore.createQuery(Employee.class);
    List<String> names = Arrays.asList("name1","name2");
    
    query.or(
         query.criteria("employeeName").hasAnyOf(names),
         query.criteria("employeeDept").hasAnyOf(names)
    );
    List<Employee> employees = query.limit(BATCH_SIZE).asList();
    

    IndexType.TEXT 不会帮助您进行该查询 - 如果您不使用 search(),那么您就没有使用全文搜索。但我认为每个属性(而不是组合)的索引是正确的方法,因为 or 查询是独立执行和合并的。

    PS:对于更大的数据集,我不认为这会太快。

    【讨论】:

    • 嗨@Xeraa,我遇到了类似的问题,但有一个不同的问题:我得到了具有4个属性的Users类:initials,firstName,middleName,lastName 在给定用户的搜索文本上,我如何结合条件和正确搜索。例如如果用户搜索 它需要找到包含所有这些条件组合中的确切字符串!不是单个字符串,因为这可能会返回错误的结果集。对于这种情况,Morphia 有什么解决方法吗?
    • 你知道哪个字段是哪个吗?然后你可以这样做:.field("firstname").equal("...").field("lastname").equal("...")
    猜你喜欢
    • 2022-11-28
    • 2011-09-14
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    相关资源
    最近更新 更多