0

単純な検索クエリのように見えることを実行しようとしていますが、方法があるかどうか、またその方法が効率的かどうかを見つけることができません。

現在、休止状態検索 4​​.3.0 で休止状態を使用しています。私がやろうとしているのは、特定のコレクションを検索することです。たとえば、InventoryItem のリストを含む Inventory クラスがあります。特定のインベントリ内のアイテムのみを検索するキーワード検索を実行したいと考えています。検索を特定のものに限定することは可能ですか。Inventory クラスと InventoryItem クラスは両方とも、主キーとして @Id Long id フィールドを持つ DatastoreObject を拡張します。

在庫クラス

/**
 * Inventory is a container of inventory objects.
 * 
 * @author chinshaw
 */
@Entity
@Indexed
public class Inventory extends DatastoreObject {

    @Size(min = 5, max = 256, message = "inventory name must be between 5 and 256 characters")
    @Column(length = 256)
    @Field
    private String name;

    @Size(max = 512, message = "inventory description cannot exceed 512 characters")
    @Column(length = 512)
    @Field
    private String description;

    /**
     * List of all inventory items in this object.
     */
    @IndexedEmbedded
    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
    private List<InventoryItem> inventoryItems = new ArrayList<InventoryItem>();
...

私の InventoryItem クラス

/**
 * 
 * @author chinshaw
 */
@Entity
@Indexed
public class InventoryItem extends DatastoreObject implements IHasImage {

    /**
     * String manufacturer's serial number.
     */
    private String sin;

    /**
     * This is the name of the item.
     */
    @NotNull
    @Field
    private String name;

    /**
     * This is the text description of the object.
     */
    @Size(max = 200, message = "description must be less than 200 characters")
    @Field
    private String description;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "inventory_id")
    private Inventory inventory;

...

私が現在試しているもののコード例

public List<InventoryItem> searchItems(Long inventoryId, String searchContext) {

    FullTextEntityManager session = Search.getFullTextEntityManager(getEntityManager());
    EntityTransaction tx = session.getTransaction();



    QueryBuilder qb = session.getSearchFactory().buildQueryBuilder().forEntity(InventoryItem.class).get();

    // How do I limit the search to only contain the inventoryId.
    org.apache.lucene.search.Query searchQuery = qb.keyword().onFields("title", "description").matching(searchContext).createQuery();
    javax.persistence.Query query  = session.createFullTextQuery(searchQuery, InventoryItem.class);

    // execute search
    List<InventoryItem> items = query.getResultList();

    tx.commit();

    return items;

}
4

1 に答える 1

2

これは、QueryBuilder の bool() メソッドで実行できるはずです。たとえば、返された をフィルタリングして、 with IDにInventoryItem属する必要があるようにするには、次を使用できます。InventoryinventoryId

org.apache.lucene.search.Query searchQuery = qb.bool()
    .must(qb.keyword().onFields("title", "description").matching(searchContext).createQuery())
    .must(qb.keyword().onField("inventory.id").matching(inventoryId).createQuery())
    .createQuery();

これにより、 のタイトル/説明での検索と、一致させたいInventoryItemの ID の間に AND 条件が作成されます。Inventory

ただし、のインデックスに含めるには、注釈InventoryItem.inventoryを付ける必要があることに注意してください。@IndexedEmbeddedInventoryItem

于 2013-07-22T18:20:58.353 に答える