我已将我的文档编入索引:
doc.add(new IntField("ID", id, Field.Store.YES));
doc.add(new TextField("First_Name", First_Name, Field.Store.YES));
doc.add(new TextField("Last_Name", Last_Name, Field.Store.YES));
doc.add(new TextField("Address", add, Field.Store.YES));
doc.add(new TextField("City", city, Field.Store.YES));
doc.add(new TextField("State", state, Field.Store.YES));
doc.add(new IntField("Zip_Code", zip, Field.Store.YES));
其中id,FirstName,city,add,state,zip是存储要编制索引的值的变量。
我想在索引上搜索“ID:someValue AND First_Name:SomeValue” 但由于int字段和字符串字段的查询解析器不同,我无法这样做。
我正在搜索文件:
Query query = queryParser.parse(searchQuery);
TopScoreDocCollector collector=TopScoreDocCollector.create(LuceneConstants.MAX_SEARCH);
indexSearcher.search(query, collector );
和整数值为:
query = NumericRangeQuery.newIntRange(field, searchTerm, searchTerm , true, true);
TopScoreDocCollector collector = TopScoreDocCollector.create(LuceneConstants.MAX_SEARCH);
indexSearcher.search(query, collector );
如何使用单个Query Parser,以便它可以处理文本和数字值?如何使用单个查询搜索此类查询?
答案 0 :(得分:0)
有几种可能性。
首先,在这种情况下我最推荐的是,或许你根本不需要那些IntField
。邮政编码和ID通常不被视为数字。它们是恰好由数字组成的标识符。如果您的邮政编码是23456,那并不意味着您居住在第23,456个邮政编码中。它只是一串任意数字。如果使用数字范围搜索字段不是很有用,您可能只需将其设为StringField
(或TextField
)。
如果你真的希望它是a IntField
,你可以跳过解析器。只需使用API构建您的查询:
BooleanQuery query = new BooleanQuery();
query.add(new BooleanClause(NumericRangeQuery.newIntRange("ID", myIdValue, myIdValue, true, true), BooleanClause.Occur.MUST));
query.add(new BooleanClause(new TermQuery(new Term("First_Name", myNameValue)), BooleanClause.Occur.MUST));