Java 搜索'$';在Lucene索引中使用RegexQuery(不是任何其他)

Java 搜索'$';在Lucene索引中使用RegexQuery(不是任何其他),java,lucene,Java,Lucene,我有以下计划: public class RegexQueryExample { public static String[] terms = { "US $65M dollars", "USA", "$35", "355", "US $33", "U.S.A", "John Keates", "Tom Dick Harry", "Southe

我有以下计划:

public class RegexQueryExample {

    public static String[] terms = {
        "US $65M dollars",
        "USA",
        "$35",
        "355",
        "US $33",
        "U.S.A",
        "John Keates",
        "Tom Dick Harry",
        "Southeast' Asia"
    };
    private static Directory directory;

    public static void main(String[] args) throws CorruptIndexException, IOException {
        String searchString = ".*\\$.*";
        createIndex();
        searchRegexIndex(searchString);
    }

    /**
     * Creates an index for the files in the data directory.
     */
    private static void createIndex() throws CorruptIndexException, LockObtainFailedException, IOException {

        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
        directory = new RAMDirectory();
        IndexWriter indexWriter = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);


        for (String term : terms) {
            Document document = new Document();
            if (term.indexOf('$') >= 0) {
                document.add(new Field("type", "currency", Field.Store.YES, Field.Index.NOT_ANALYZED));
            } else {
                document.add(new Field("type", "simple_field", Field.Store.YES, Field.Index.NOT_ANALYZED));
            }
            document.add(new Field("term", term, Field.Store.YES, Field.Index.NOT_ANALYZED));
            indexWriter.addDocument(document);
        }

        indexWriter.close();
    }

    /**
     * searches for a regular expression satisfied by a file path.
     *
     * @param searchString the string to be searched.
     */
    private static void searchRegexIndex(String regexString) throws CorruptIndexException, IOException {
        regexString = regexString;
        IndexSearcher searcher = new IndexSearcher(directory);

        RegexQuery rquery = new RegexQuery(new Term("term", regexString));
        BooleanQuery queryin = new BooleanQuery();
        BooleanQuery query = new BooleanQuery();
        query.add(new TermQuery(new Term("type", "simple_field")), BooleanClause.Occur.MUST);
        query.add(rquery, BooleanClause.Occur.MUST);

        TopDocs hits = searcher.search(query, terms.length);
        ScoreDoc[] alldocs = hits.scoreDocs;
        for (int i = 0; i < alldocs.length; i++) {
            Document d = searcher.doc(alldocs[i].doc);
            System.out.println((i + 1) + ". " + d.get("term"));
        }
    }
}
public类RegexQueryExample{
公共静态字符串[]术语={
“6500万美元”,
“美国”,
"$35",
"355",
“33美元”,
“美国”,
“约翰·基茨”,
“汤姆·迪克·哈利”,
“东南亚”
};
私有静态目录;
公共静态void main(字符串[]args)引发CorruptIndexException,IOException{
String searchString=“.\\$*”;
createIndex();
searchRegexIndex(searchString);
}
/**
*为数据目录中的文件创建索引。
*/
私有静态void createIndex()引发CorruptIndexException、LockOcctainFailedException、IOException{
Analyzer Analyzer=新标准分析仪(版本:LUCENE_30);
directory=new-RAMDirectory();
IndexWriter IndexWriter=新的IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
for(字符串术语:术语){
文档=新文档();
if(term.indexOf(“$”)>=0){
添加(新字段(“类型”,“货币”,Field.Store.YES,Field.Index.NOT_analysis));
}否则{
添加(新字段(“类型”,“简单字段”,Field.Store.YES,Field.Index.NOT_analysis));
}
添加(新字段(“术语”,术语,Field.Store.YES,Field.Index.NOT_analysis));
indexWriter.addDocument(文档);
}
indexWriter.close();
}
/**
*搜索文件路径满足的正则表达式。
*
*@param searchString要搜索的字符串。
*/
私有静态void searchRegexIndex(字符串regexString)抛出CorruptIndexException,IOException{
regexString=regexString;
IndexSearcher=newindexSearcher(目录);
RegexQuery rquery=newregexquery(新术语(“术语”,regexString));
BooleanQuery queryin=新的BooleanQuery();
BooleanQuery=新建BooleanQuery();
add(新术语查询(新术语(“类型”、“简单_字段”))、BooleanClause.occure.MUST);
add(rquery,BooleanClause.occurrent.MUST);
TopDocs hits=searcher.search(查询、术语、长度);
ScoreDoc[]alldocs=hits.scoreDocs;
for(int i=0;i
createIndex()
函数在执行正则表达式查询时创建Lucene索引。在
main()
函数中,我搜索
*\$.*
希望它返回包含
$
符号的术语。但是,它没有起作用。我如何让它工作?这是分析仪的问题吗

编辑:

来自Luke的我的Lucene索引快照:


您正在使用StandardAnalyzer,它将从代币中删除美元符号。例如,“6500万美元”变成三个代币:“US”、“6500万美元”、“美元”。您需要使用另一个不删除美元符号的分析器。提供了一个优秀的分析器工具,您可以在其中试用不同的分析器并检查其输出。

您使用的是StandardAnalyzer,它可以从令牌中删除美元符号。例如,“6500万美元”变成三个代币:“US”、“6500万美元”、“美元”。您需要使用另一个不删除美元符号的分析器。提供了一个优秀的分析器工具,您可以在其中试用不同的分析器并检查它们的输出。

您知道我是否可以使用Luke进行RegexQuery吗。我在Luke中打开了索引,在搜索界面中找不到用于正则表达式查询的选项。它似乎创建了来自
QueryParser
的查询:(我已经更新了我的问题,以包括Luke中看到的索引快照。索引中仍然存在
$
符号(可能是因为我没有分析术语)你说得对,Luke使用QueryParser,它不支持RegexQuery。很抱歉。但是关于你的代码,在这一行将“simple\u field”更改为“currency:
query.add(新术语查询(新术语(“type”,“simple\u field”)),BooleanClause.occurrence.MUST)
您知道我是否可以使用Luke进行RegexQuery。我在Luke中打开了索引,在搜索界面中找不到regex查询的选项。它似乎从
QueryParser
创建了查询:(我已经更新了我的问题,以包括Luke中所示的索引快照。
$
符号仍然存在于索引中(可能是因为我没有分析术语)你是对的,Luke使用QueryParser,它不支持RegexQuery。对不起。但是关于你的代码,请在这一行将“simple_field”更改为“currency:
query.add(new TermQuery(new Term(“type”,“simple_field”)),BooleanClause.Occurse.MUST);
查看您当前使用的regexp功能,听起来可能不支持前缀。当前我无法测试您的代码,但查看您索引的术语,您的regexp功能当前可能不受默认regexp功能的支持。查看您当前使用的regexp功能Ing,听起来可能不支持前缀。目前我无法测试您的代码,但查看您索引的术语,您的regexp当前可能不受默认regexp功能的支持。