2

我在实体上有以下字段:

@Field(index = Index.TOKENIZED, store = Store.YES)
@Column(name = "total_credit_amount", nullable = false)
@FieldBridge(impl = RoundedDoubleBridge.class)
private Double totalCreditAmount;

@Field(index = Index.TOKENIZED, store = Store.YES)
@Column(name = "total_debit_amount", nullable = false)
@FieldBridge(impl = RoundedDoubleBridge.class)
private Double totalDebitAmount;

Double to String 桥接实现如下:

public class RoundedDoubleBridge
    implements StringBridge
{
@Override
    public String objectToString(Object value)
    {
        // Do not index null strings
        if (value == null)
        {
            return null;
        }

        if (value instanceof Double)
        {
            long price = round((Double) value);

            return Long.toString(price);
        }
        else
        {
            throw new IllegalArgumentException(
                RoundedDoubleBridge.class + " used on a non double type: "
                + value.getClass());
        }
    }


    private long round(double price)
    {
        double rounded = Math.floor(price / 3) * 3;

        if (rounded != price)
        {
            rounded += 3; //we round up
        }

        return (long) rounded;
    }
}

所以这里的问题是,只要 totalDebitAmount 或 totalCreditAmount 上的值小于 100000,只要它们大于或等于 100000 搜索失败,我正在执行的搜索就会检索结果。任何帮助表示赞赏..

以下是我进行搜索的方式:

public List<AbstractRecord> doSearch(String stringToFind)
    {
        List<AbstractRecord> result = null;

        // Test Search for specific values of an Abstract Record
        // Aim to return the number of retreived results
        em = emf.createEntityManager();

        FullTextEntityManager fullTextEntityManager =
            org.hibernate.search.jpa.Search.getFullTextEntityManager(em);

        //em.getTransaction().begin();
        String[] fields = // Fields to be reviewed
            new String[]
            {
               ....,
               "totalCreditAmount", "totalDebitAmount",
               ....
            };

        //Create a multi-field Lucene query
        StandardAnalyzer stdAnalyzer = new StandardAnalyzer(Version.LUCENE_30);
        MultiFieldQueryParser parser =
            new MultiFieldQueryParser(Version.LUCENE_30, fields, stdAnalyzer);
        org.apache.lucene.search.Query query = null;

        try
        {
            query = parser.parse(stringToFind);
        }
        catch (ParseException ex)
        {
            Logger.getLogger(SearchFacade.class.getName()).log(Level.SEVERE, null, ex);
        }

        long time1 = System.currentTimeMillis();

        // Wrap Lucene query in a javax.persistence.Query
        javax.persistence.Query persistenceQuery =
            fullTextEntityManager.createFullTextQuery(query);
        // Execute search
        result = (List<AbstractRecord>) persistenceQuery.getResultList();
        em.close();

        return result;
    }
4

1 回答 1

1

嗯,我觉得有点傻。我发现了我的问题..具体是在我的FieldBridge实现的舍入功能 桥的相关片段如下:

private long round(double price)
    {
        double rounded = Math.floor(price / 3) * 3;

        if (rounded != price)
        {
            rounded += 3; //we round up
        }

        return (long) rounded;
    }

注意价格 = 100000 变量舍入= 99999 在检查 if 条件后,因为它与价格不同,它将添加 3,因此索引 100002 而不是 100000,因此如果我查找 100002,我会找到适当的记录..

在这里学到的教训:

  • 如果您正在实现一个定制的 填充和/或圆角的DoubleBridge,请确保舍入函数满足您所有的数据值范围,以避免像我遇到的问题。
  • 如果您需要在屏幕上以普通符号而不是科学的形式显示双精度数,您将需要实现一个TwoWayStringBridge来执行ObjectToString转换填充和舍入,然后在 StringToObject转换返回普通符号 Double 而不是其科学符号。

希望这篇文章可以帮助任何有类似问题的人。问候

于 2011-02-16T13:22:46.360 回答