FirteX-高性能全文索引和检索平台API Documentation |
00001 #ifndef __QUERYPARSER_H 00002 #define __QUERYPARSER_H 00003 #include <string> 00004 #include <vector> 00005 #include "../analyzer/Analyzer.h" 00006 #include "QueryParserConstants.h" 00007 #include "../utility/StringReader.h" 00008 #include "Query.h" 00009 00010 using namespace firtex::analyzer; 00011 using namespace firtex::utility; 00012 using namespace std; 00013 00014 00015 namespace firtex 00016 { 00017 namespace search 00018 { 00019 00020 #define CONJ_NONE 0 00021 #define CONJ_AND 1 00022 #define CONJ_OR 2 00023 00024 #define MOD_NONE 0 00025 #define MOD_NOT 10 00026 #define MOD_REQ 11 00027 00028 class CTokenList; 00029 class CBooleanClause; 00030 class CQueryToken; 00031 class CQueryParser 00032 { 00033 public: 00039 CQueryParser(const tchar* field,CAnalyzer* pAnalyzer,bool bDeleteAnalyzer); 00040 00047 CQueryParser(const tchar** fields,CAnalyzer** pAnalyzers,int32_t numFields); 00048 00049 virtual ~CQueryParser(void); 00050 public: 00059 static CQuery* parse(const tchar* query,const tchar* field,CAnalyzer* pAnalyzer,bool bDeleteAnalyzer); 00060 00067 CQuery* parse(const tchar* query); 00068 00075 void attachAnalyzer(const tchar* field,CAnalyzer* pAnalyzer); 00076 00083 CAnalyzer* detachAnalyzer(const tchar* field); 00084 protected: 00085 CQuery* parse(CStringReader* reader); 00086 00093 CQuery* MatchQuery(const tstring& field); 00094 00095 CAnalyzer* getAnalyzer(const tstring& field); 00096 private: 00101 int32_t matchConjunction(); 00102 00107 int32_t matchModifier(); 00108 00109 00114 CQuery* matchQuery(const tstring& field); 00115 00120 CQuery* matchClause(const tstring& field); 00121 00129 CQuery* matchTerm(const tstring& field); 00130 00135 CQueryToken* matchQueryToken(QueryTokenTypes expectedType); 00136 00140 void extractAndDeleteToken(void); 00141 00142 void addClause(vector<CBooleanClause*>* clauses, int32_t conj, int32_t mods, CQuery* q); 00143 00144 string discardEscapeChar(const tstring& token); 00145 CQuery* getFieldQuery(const tstring& field, const tstring& queryText); 00146 CQuery* getRangeQuery(const tstring& field, const tstring& queryText, bool inclusive); 00147 00148 private: 00149 struct AnalyzerRef 00150 { 00151 AnalyzerRef(int32_t _ref,bool _del):ref(_ref),del(_del){} 00152 AnalyzerRef(const AnalyzerRef& clone):ref(clone.ref),del(clone.del){} 00153 int32_t ref; //引用计数 00154 bool del; //是否删除 00155 }; 00156 map<tstring,CAnalyzer*> m_analyzers; 00157 map<CAnalyzer*,AnalyzerRef> m_distinctAnalyzers; 00158 00159 CFXString m_defaultField; //当查询表达式没有提供字段名时作为默认字段名 00160 CAnalyzer* m_defaultAnalyzer; 00161 00162 CTokenList* m_tokens; 00163 00164 bool m_lowercaseWildcardTerms; 00165 }; 00166 } 00167 } 00168 00169 #endif
http://www.firtex.org http://www.sourceforge.net/projects/firtex