/// <summary>
        /// 移除某个用户的索引
        /// </summary>
        /// <param name="userId"></param>
        public void RemoveIndex(List <int> userIds, string maxshop)
        {
            var isNew = false;
            var path  = _indexPath + "\\" + maxshop;

            // 从磁盘directory 中移除
            var directory = FSDirectory.Open(path);

            isNew = !IndexReader.IndexExists(directory);
            var maxFieldLength = new IndexWriter.MaxFieldLength(IndexWriter.DEFAULT_MAX_FIELD_LENGTH);

            using (var writer = new IndexWriter(directory, new StandardAnalyzer(Version.LUCENE_30), isNew, maxFieldLength))
            {
                foreach (var userId in userIds)
                {
                    writer.DeleteDocuments(new Term("UserId", userId.ToString()));
                }
                writer.Optimize();
            }

            // 从内存directory中移除
            var ramDirectory = RamDirectoryFactory.GetRamDirectory(path, directory);

            isNew = !IndexReader.IndexExists(ramDirectory);
            using (var writer = new IndexWriter(ramDirectory, new StandardAnalyzer(Version.LUCENE_30), isNew, maxFieldLength))
            {
                foreach (var userId in userIds)
                {
                    writer.DeleteDocuments(new Term("UserId", userId.ToString()));
                }
                writer.Optimize();
            }
        }
        /// <summary>
        /// 新增某个用户的索引
        /// </summary>
        /// <param name="user"></param>
        public void AddUserIndex(UserInfo user)
        {
            if (string.IsNullOrEmpty(user.MaxShopId))
            {
                throw new ArgumentNullException("max_shop");
            }

            var document = GetUserFromIndexDirectoryByUid(user.UserId, user.MaxShopId);

            if (document != null)
            {
                RemoveIndex(user.UserId, user.MaxShopId);
            }

            var isNew     = false;
            var path      = _indexPath + "\\" + user.MaxShopId;
            var directory = FSDirectory.Open(path);

            isNew = !IndexReader.IndexExists(directory);
            AddUserIndexToDirectory(user, directory, isNew);

            var ramDirectory = RamDirectoryFactory.GetRamDirectory(path, directory);

            isNew = !IndexReader.IndexExists(ramDirectory);
            AddUserIndexToDirectory(user, ramDirectory, isNew);
        }
        private Document GetUserFromIndexDirectoryByUid(string accId, string maxShopId)
        {
            // 搜索用户是否存在
            var           indexPath    = _indexPath + "\\" + maxShopId;
            FSDirectory   directory    = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
            var           ramDirectory = RamDirectoryFactory.GetRamDirectory(indexPath, directory);
            IndexReader   reader       = IndexReader.Open(ramDirectory, true);
            IndexSearcher searcher     = new IndexSearcher(reader);

            var idTerm  = new Term("UserId", accId);
            var idQuery = new TermQuery(idTerm);

            var result   = searcher.Search(idQuery, 1);
            var userInfo = new UserInfo()
            {
                ShopId = accId, MaxShopId = maxShopId
            };

            if (result.TotalHits == 0)
            {
                return(null);
            }

            var document = searcher.Doc(result.ScoreDocs[0].Doc);

            return(document);
        }
        /// <summary>
        /// 移除某个用户的索引
        /// </summary>
        /// <param name="userId"></param>
        public void RemoveIndex(string userId, string maxshop)
        {
            var isNew = false;
            var path  = _indexPath + "\\" + maxshop;

            // 从磁盘directory 中移除
            var directory = FSDirectory.Open(path);

            isNew = !IndexReader.IndexExists(directory);
            RemoveIndexFromDirectory(directory, userId, isNew);

            // 从内存directory中移除
            var ramDirectory = RamDirectoryFactory.GetRamDirectory(path, directory);

            isNew = !IndexReader.IndexExists(ramDirectory);
            RemoveIndexFromDirectory(ramDirectory, userId, isNew);
        }
        /// <summary>
        /// 搜索用户
        /// </summary>
        /// <param name="shopIds">店铺Id列表</param>
        /// <param name="term">关键字</param>
        /// <returns></returns>
        public List <int> Search(int maxShop, string term)
        {
            var         indexPath = _indexPath + "\\" + maxShop;
            FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());

            var           ramDirectory = RamDirectoryFactory.GetRamDirectory(indexPath, directory);
            IndexReader   reader       = IndexReader.Open(ramDirectory, true);
            IndexSearcher searcher     = new IndexSearcher(reader);

            var nameParse = new QueryParser(Version.LUCENE_30, "Name", new StandardAnalyzer(Version.LUCENE_30));
            var nameQuery = nameParse.Parse(term);

            var phoneTerm  = new Term("Phone", string.Format("*{0}*", term));
            var phoneQuery = new WildcardQuery(phoneTerm);

            var numberTerm  = new Term("Number", string.Format("*{0}*", term));
            var numberQuery = new WildcardQuery(numberTerm);

            var uPinYinShortTerm  = new Term("UPinYinShort", string.Format("*{0}*", term.ToUpper()));
            var uPinYinShortQuery = new WildcardQuery(uPinYinShortTerm);

            var uPinYinFullTerm  = new Term("UPinYinFull", string.Format("*{0}*", term.ToUpper()));
            var uPinYinFullQuery = new WildcardQuery(uPinYinFullTerm);

            var query = new BooleanQuery();

            query.Add(uPinYinShortQuery, Occur.SHOULD);
            query.Add(uPinYinFullQuery, Occur.SHOULD);
            query.Add(phoneQuery, Occur.SHOULD);
            query.Add(numberQuery, Occur.SHOULD);
            query.Add(nameQuery, Occur.SHOULD);

            var docs = searcher.Search(query, 20);

            var result = new List <int>();

            foreach (var doc in docs.ScoreDocs)
            {
                var document = searcher.Doc(doc.Doc);
                result.Add(Convert.ToInt32(document.Get("UserId")));
            }

            return(result);
        }
        /// <summary>
        /// 新增某个用户的索引
        /// </summary>
        /// <param name="user"></param>
        public void AddUserIndex(List <UserInfo> users, int maxshopId)
        {
            var isNew          = false;
            var path           = _indexPath + "\\" + maxshopId;
            var directory      = FSDirectory.Open(path);
            var maxFieldLength = new IndexWriter.MaxFieldLength(IndexWriter.DEFAULT_MAX_FIELD_LENGTH);

            isNew = !IndexReader.IndexExists(directory);

            // 添加到文件索引
            var analyzer = new StandardAnalyzer(Version.LUCENE_30);

            using (var writer = new IndexWriter(directory, analyzer, isNew, maxFieldLength))
            {
                foreach (var user in users)
                {
                    var document = new Document();

                    document.Add(new Field("UserId", user.UserId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("ShopId", user.ShopId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("UPinYinShort", user.UPinYinShort.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("UPinYinFull", user.UPinYinFull.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("Name", user.Name.ToString(), Field.Store.YES, Field.Index.ANALYZED));

                    if (!string.IsNullOrWhiteSpace(user.Phone))
                    {
                        document.Add(new Field("Phone", user.Phone.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    }
                    if (!string.IsNullOrWhiteSpace(user.Number))
                    {
                        document.Add(new Field("Number", user.Number.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    }


                    writer.AddDocument(document);
                }

                writer.Optimize();
            }

            // 添加到内存索引
            var ramDirectory = RamDirectoryFactory.GetRamDirectory(path, directory);

            using (var writer = new IndexWriter(ramDirectory, analyzer, isNew, maxFieldLength))
            {
                foreach (var user in users)
                {
                    var document = new Document();

                    document.Add(new Field("UserId", user.UserId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("ShopId", user.ShopId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("UPinYinShort", user.UPinYinShort.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("UPinYinFull", user.UPinYinFull.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    document.Add(new Field("Name", user.Name.ToString(), Field.Store.YES, Field.Index.ANALYZED));

                    if (!string.IsNullOrWhiteSpace(user.Phone))
                    {
                        document.Add(new Field("Phone", user.Phone.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    }
                    if (!string.IsNullOrWhiteSpace(user.Number))
                    {
                        document.Add(new Field("Number", user.Number.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
                    }

                    writer.AddDocument(document);
                }

                writer.Optimize();
            }
        }